【问题标题】:Passing a string inside viewDidAppear in objective-c在objective-c中的viewDidAppear中传递一个字符串
【发布时间】:2016-07-04 07:38:57
【问题描述】:

我想在 viewDidAppear 中传递一个字符串,但它只需要 BOOL 值。但我需要将viewDidAppear 用于不同的viewcontrollers,并且在每个视图控制器中我想使用不同的字符串。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
    [tracker set:kGAIScreenName value:@"Google Analytics"];
    [tracker send:[[GAIDictionaryBuilder createScreenView] build]];
}

在这里,我们希望从不同的viewControllers 传递一个字符串。请帮忙!

【问题讨论】:

  • 要替换的字符串
  • 您不能更改 cocoa API 的参数。字符串变量必须可以从 ViewDidAppear 访问,但不能传递给它。
  • value:@"Google Analytics" 这个应该根据不同的viewcontroller不同。

标签: ios objective-c methods


【解决方案1】:

你想在谷歌分析中发送 viewController 的名称吗?

如果正确,您将 value 更改为 traker

[tracker set:kGAIScreenName value:@"change here"]

【讨论】:

    【解决方案2】:

    这可以通过使用子类轻松实现。

    1. 创建UIViewControllerlike 类型的子类

    SuperViewController.h

    @interface SuperController : UIViewController
    @property (strong,nonatomic)NSString *screenValue;
    @end
    

    SuperViewController.m

    @implementation SuperViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    }
    
    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
    
        id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
        [tracker set:kGAIScreenName value:screenValue];
        [tracker send:[[GAIDictionaryBuilder createScreenView] build]];
    }
    
    @end
    
    1. 现在使用 SuperViewController 作为所有 ViewControllers 的子类,你想在 viewDidAppear 中使用代码,就像

    YOURViewController.h

    @interface YOURViewController : SuperViewController
    
    @end
    

    YOURViewController.m

    @implementation YOURViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
       self.screenValue=@"YOURSCREENVALUE";
    }
    @end
    

    在您指定 SuperViewController 作为子类的每个 ViewController 的 viewDidLoad 中定义 screenValue 值,它会自动调用具有特定 screenName 的 viewDidAppear。

    希望对你有帮助。

    【讨论】:

    • 这里有一个问题,因为Obj-C上的单继承,当你从UITableViewControllerUICollectionViewController等继承时不能使用这个方法
    • 还有另一种解决方案不使用UITableViewControllerUICollectionViewController 仅使用UIViewController 并将UITableViewUICollectionView 嵌入其中?
    • 你是对的,虽然你失去了一些东西 - 自动滚动到焦点文本字段,故事板中的静态单元格等。此外,如果你想使用自定义库(来自 cocoapod 的instance) 并且它还要求您从他们的自定义视图控制器继承。
    【解决方案3】:

    子类化的替代方法是使用 Objective-C 类别。类别可让您将方法添加到类(包括 SDK 中的类)。

    所以你可以有这样的东西:

    UIViewController+Tracking.h

    @interface UIViewController (Tracking)
    
    - (void)track:(NSString *)trackingValue;
    
    @end
    

    UIViewController+Tracking.m

    @implementation UIViewController (Tracking)
    
    - (void)track:(NSString *)value {
        id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
        [tracker set:kGAIScreenName value:trackingValue];
        [tracker send:[[GAIDictionaryBuilder createScreenView] build]];
    }
    
    @end
    

    在此之后,UIViewController 的所有实例和子类(例如,包括UITableViewController 及其子类)都可以使用此方法。然后你可以像这样使用它:

    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        [self track:@"value you want to track"];
    }
    

    【讨论】:

    • 如果我想要这三个或四个班级,我应该为他们创建一个单独的类别吗?
    • 如果他们都继承自UIViewController,那么没有。您可以阅读更多关于类别here 的信息。另一方面,如果他们不共享一个共同的父类,那么我建议创建一个单例类来管理您的跟踪。
    猜你喜欢
    • 2021-02-07
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多