来自AppDelegate的iphone setRightBarButtonItem

时间:2010-11-24 10:32:15

标签: iphone

我正在尝试从appDelegate中设置导航栏的右键,代码编译并执行但没有错误,但按钮没有出现。

任何帮助都将不胜感激。

感谢。

NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];
    UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
    UIBarButtonItem *activityButtonItem = [[UIBarButtonItem alloc] initWithCustomView:aiv];
    [aiv startAnimating]; 
    [aiv release];


    [self.navigationController.navigationItem setRightBarButtonItem:activityButtonItem animated:YES];
    [activityButtonItem release];
    [apool release];

2 个答案:

答案 0 :(得分:2)

首先指出几点。

在短时间内创建大量自动释放对象的情况下使用NSAutoReleasePool,例如在一个循环中。引用Apple:

  

如果您的应用程序创建了很多   临时自动释放的对象   然而,它可能是事件循环   有利于创造“本地”   自动释放池有助于最小化   峰值内存占用。

由于您没有创建任何自动释放的对象,因此不必拥有NSAutoReleasePool

通常,您会将代码设置为viewDidLoad UIViewController中应该响应按钮的导航栏按钮。当UINavigationController将新UIViewController推送到其堆栈时,它将询问控制器是否应显示任何按钮。

假设UINavigationController的根视图控制器是默认生成的RootViewController。然后,您应该将代码放在viewDidLoad的{​​{1}}中。或者也许在RootViewController中,因为您正在为插入设置动画。

viewDidAppear:

如果你真的必须在app委托中拥有可以通过以下方式完成的代码:

UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
UIBarButtonItem *activityButtonItem = [[UIBarButtonItem alloc] initWithCustomView:aiv];
[aiv startAnimating]; 
[aiv release];

[self.navigationItem setRightBarButtonItem:activityButtonItem animated:YES];
[activityButtonItem release];

答案 1 :(得分:0)

罗伯特感谢你的建议。

我已经取出了autorelease并且欣赏通常应该在ViewDidLoad中使用,并且可以在用于启动活动动画时确认完美。

我遇到的问题是:

我可以使用相关视图控制器中的示例代码来启动动画

UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
UIBarButtonItem *activityButtonItem = [[UIBarButtonItem alloc] initWithCustomView:aiv];
[aiv startAnimating]; 
[aiv release];

[self.navigationItem setRightBarButtonItem:activityButtonItem animated:YES];
[activityButtonItem release];

但我有一个IAP的单例对象,它是从我的应用程序中的各种视图控制器调用的,我需要能够停止活动动画 - 想想只需要设置rightBarButton = nil但是很难弄清楚单身人士如何object可以告诉相应的视图控制器停止动画。

我想过尝试使用类似的东西:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (IAP_complete:) name: IAP_completeNotification object:nil]; 

但还没有想出完整的过程从头到尾。感谢您提供的任何帮助;

  1. viewController设置rightBarItem并启动动画(完成)
  2. 设置NSNotificationCenter以监听IAP已完成(如果这是实现的最佳方式)
  3. 设置单例对象NSNotificationCenter以广播IAP已完成
  4. 要扩展此

    我正在使用Mugunth Kumar的MKStoreKit 3 http://blog.mugunthkumar.com/coding/introducing-mkstorekit- - 版本-3 /

    我修改了这个以满足我的需要,但只是简单地说;

    在我的VC中,我使用以下内容启动应用内购买

    //display activity indicator
    UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
    UIBarButtonItem *activityButtonItem = [[UIBarButtonItem alloc] initWithCustomView:aiv];
    [aiv startAnimating]; 
    [aiv release];
    
    [self.navigationItem setRightBarButtonItem:activityButtonItem animated:YES];
    [activityButtonItem release];
    
    //begin in app purchase
    [[MKStoreManager sharedManager] buyFeature:appID];
    

    一旦完成,我需要告诉VC这是完整的。

    在文件MKStoreManager.m

    - (void)provideContent:(NSString *)productIdentifier            forReceipt:(NSData *)receiptData

    我在这里解锁或下载内容,但需要停止活动指示器,这也是我错过情节的地方。

    谢谢, 麦克