在prepareForSegue中传递对ViewController的引用(Pass a reference to ViewController in prepareForSegue)
我有2个视图控制器,称之为ViewController1和ViewController2。 当我想加载ViewController2时,从ViewController1调用模态segue。 我在ViewController1中有一个方法需要在ViewController2显示时调用。 我的想法是在ViewController2中有一个属性,它是对ViewController1的引用,以便我可以访问该方法。
@property (strong, nonatomic) ViewController1 *vc1Reference;这个属性将在prepareForSegue方法中设置,如下所示:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // 1 if ([[segue identifier] isEqualToString:@"sequeToVC2"]) { // 2 ViewController2 *vc2 = segue.destinationViewController; // 3 vc2.vc1Reference = (ViewController1*)segue.sourceViewController; // 4 } }但是第4行给出了这个错误:ARC不允许将Objective-C指针隐式转换为'int *'。
我该怎么设置参考?
I have 2 view controllers, call them ViewController1 and ViewController2. A modal segue is invoked from ViewController1 when I want to load ViewController2. I have a method in ViewController1 that needs to be called at some point when ViewController2 is showing. My idea is to have a property in ViewController2 that is a reference to ViewController1 so that I can get access to the method.
@property (strong, nonatomic) ViewController1 *vc1Reference;This property would be set in the prepareForSegue method like so:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // 1 if ([[segue identifier] isEqualToString:@"sequeToVC2"]) { // 2 ViewController2 *vc2 = segue.destinationViewController; // 3 vc2.vc1Reference = (ViewController1*)segue.sourceViewController; // 4 } }However line 4 gives me this error: Implicit conversion of an Objective-C pointer to 'int *' is disallowed with ARC.
How am I supposed to set the reference?
原文:https://stackoverflow.com/questions/14228191
最满意答案
我发现解决方案,我认为谷歌团队可以比现在更好地记录。 以下代码演示了一个使用oauth2的c#示例。
private static async Task Run() { var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( new ClientSecrets { ClientId = Settings.Default.ClientId, ClientSecret = Settings.Default.ClientSecret }, new[] {AnalyticsReportingService.Scope.AnalyticsReadonly}, "user", CancellationToken.None); var service = new AnalyticsReportingService(new BaseClientService.Initializer { ApplicationName = "GAReportDownloader", HttpClientInitializer = credential }); // Content here Console.WriteLine("Hello from Google Analytics. Starting.."); // Create the DateRange object. var dateRange = new DateRange {StartDate = "2017-07-01", EndDate = "2017-07-10"}; // Create the Metrics object. var sessions = new Metric {Expression = "ga:sessions", Alias = "Sessions"}; //Create the Dimensions object. var browser = new Dimension {Name = "ga:browser"}; // Create the ReportRequest object. var reportRequest = new ReportRequest { ViewId = "YOURVIEWIDHERE", DateRanges = new List<DateRange> {dateRange}, Dimensions = new List<Dimension> {browser}, Metrics = new List<Metric> {sessions} }; var requests = new List<ReportRequest> {reportRequest}; // Create the GetReportsRequest object. var getReport = new GetReportsRequest {ReportRequests = requests}; // Call the batchGet method. var response = service.Reports.BatchGet(getReport).Execute(); Console.WriteLine(); } }
I found the solution tho I think it can be better documented by the Google team than it is now. The following code demonstrates one working c# example with oauth2.
private static async Task Run() { var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( new ClientSecrets { ClientId = Settings.Default.ClientId, ClientSecret = Settings.Default.ClientSecret }, new[] {AnalyticsReportingService.Scope.AnalyticsReadonly}, "user", CancellationToken.None); var service = new AnalyticsReportingService(new BaseClientService.Initializer { ApplicationName = "GAReportDownloader", HttpClientInitializer = credential }); // Content here Console.WriteLine("Hello from Google Analytics. Starting.."); // Create the DateRange object. var dateRange = new DateRange {StartDate = "2017-07-01", EndDate = "2017-07-10"}; // Create the Metrics object. var sessions = new Metric {Expression = "ga:sessions", Alias = "Sessions"}; //Create the Dimensions object. var browser = new Dimension {Name = "ga:browser"}; // Create the ReportRequest object. var reportRequest = new ReportRequest { ViewId = "YOURVIEWIDHERE", DateRanges = new List<DateRange> {dateRange}, Dimensions = new List<Dimension> {browser}, Metrics = new List<Metric> {sessions} }; var requests = new List<ReportRequest> {reportRequest}; // Create the GetReportsRequest object. var getReport = new GetReportsRequest {ReportRequests = requests}; // Call the batchGet method. var response = service.Reports.BatchGet(getReport).Execute(); Console.WriteLine(); } }
相关问答
更多-
如何向Google Analytics报告API v4进行身份验证(How to authenticate to Google Analytics Reporting API v4)[2023-04-08]
发现我错过了什么: Google API客户端库“选项”: google.options({ auth: oauth2Client }); //this one is not very optional 与Google Analytics Reporting API v4文档不同,使用客户端库的查询必须具有标头,以便为每个请求指定一个客户端(感谢CVarisco发现客户端库文档不准确..): var request ={ 'headers': {'Content-Type': 'applicati ... -
这个有点晚了。 我有一个类似的问题,它看起来像你可以使用的运算符,你想要的是PARTIAL。 希望这可以帮助其他有类似问题的人。 https://developers.google.com/analytics/devguides/reporting/core/v4/rest/v4/reports/batchGet#Operator A bit late to this one. I had a similar problem and it looks like these are the operators ...
-
文档可能会好很多 - 不幸的是,它会让人们相信你会为每个具有零值的维度组合返回行。 不幸的是,事实并非如此。 如果您要从查询中排除ChannelGrouping,您确实会获得日期范围内所有yearMonth值的行,即使有0个会话也是如此。 换句话说,当您仅在查询中包含日期维度(而不是时间维度)时,这可以正常工作。 我相信这是因为每个日期的每个维度的基数是未知的。 您是否希望每年有一个0次会话,每个月和ChannelGrouping组合? 如果您将国家/地区和城市添加为维度怎么办? 可以获得您所追求的结果,而 ...
-
我正在回答我自己的问题,以防其他人需要帮助使用谷歌分析报告api v4 with react。 这是我需要做的,以便构建一个gapi按钮,然后发出一个基本的请求。 我创造的错误来自一个错字。 而不是metrics:[{expression: 'ga:sessions'}]我使用的是metrics:[{express: 'ga:sessions'}] 。 这是一个创建简单请求的组件。 请注意,您必须将VIEW_ID更改为您的值。 import React, { Component } from 'react' ...
-
这个修改过的脚本怎么样? 要使用此功能,请在API控制台上启用Sheet API v4,并在Advanced Google Services上启用Sheet API v4。 修改脚本: function readRange(spreadsheetId) { var response = Sheets.Spreadsheets.Values.batchGet( "someSpreadSheetID", {ranges: ["Sheet1!D7:F7", "Sheet1!J7:L7"]} ...
-
我发现解决方案,我认为谷歌团队可以比现在更好地记录。 以下代码演示了一个使用oauth2的c#示例。 private static async Task Run() { var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( new ClientSecrets { ClientId = Settings.Default.Cl ...
-
API密钥仅用于访问公共数据,这意味着您只能将其与元数据api一起使用 。 Google Analytics数据是用户拥有的私人数据。 由于这是您尝试访问的自己的数据,因此您应该创建一个服务帐户。 服务帐户是预先授权的。 转到Google开发人员控制台并创建服务帐户凭据 。 然后获取服务帐户电子邮件地址,并将其作为用户添加到Google Analytics分析网站管理部分的ACCOUNT级别。 它必须是ACCOUNT级别。 您现在已授权服务帐户访问该帐户的数据。 服务帐户验证 // Copyright 20 ...
-
速率限制发生了变化,早先的每个API调用都属于5QPS的同一桶。 现在,他们将速率限制桶分离到不同类型的API调用。 您可以在以下链接中找到有关较新速率限制的更多详细信息 https://developers.google.com/my-business/content/limits There are changes to rate limits, earlier every API call used to fall into the same bucket of 5QPS. Now they sepa ...
-
错误:Analytics Reporting API V4尚未在项目中使用(Error : Analytics Reporting API V4 has not been used in project)[2022-08-30]
如错误消息中所述,您需要启用Analytics Reporting API 。 他们轻松地为您提供了错误中的直接链接到同一页面。 从屏幕截图中您已启用Analytics API 。 其中包含Management API V3和旧的Core Reporting API V3 。 随着Analytics Reporting API V4的发布,您需要启用完全新的API。 好消息是授权仍使用相同的范围,因此您的用户无需重新授权您的应用程序。 As stated in the error message, you ... -
我有以下答案: POST https://analyticsreporting.googleapis.com/v4/reports:batchGet { "reportRequests":[ { ... "dimensions": [ { "name":"ga:dimension3" },{ "name":"ga:dimension5" }], ... }] } 请参阅此处的详细信息将Core Re ...