2010-11-24 67 views
2

我想从appDelegate中设置导航栏的右键,代码编译和执行没有错误,但没有出现按钮。iphone setRightBarButtonItem from 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

第一个几点。

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

如果您的应用创造了很多 临时自动释放对象的范围内 事件循环,但是,它可能是 利于打造“本地” 自动释放池,以帮助最大限度地减少 峰值内存占用。

由于没有创建任何自动释放对象,没有必要有NSAutoReleasePool

通常情况下,您会将代码设置为UIViewControllerviewDidLoad中的导航栏的按钮,该按钮将响应该按钮。当UINavigationController将新的UIViewController推到其堆栈上时,它会要求该控制器显示任何按钮。

假设您的UINavigationController的根视图控制器是默认生成的RootViewController。那么你应该把代码放在viewDidLoadRootViewController。或者可能在viewDidAppear:中,因为您正在为插入设置动画。

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

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

如果你真的必须在应用程序委托的代码,它可以通过以下方式实现:

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

UIViewController *rootController = [self.navigationController topViewController]; 
rootController.navigationItem.rightBarButtonItem = activityButtonItem;  
[activityButtonItem release]; 
+0

谢谢,我已经张贴作为一个单独的答案,这篇文章是我的答复是长.. – Mike 2010-11-24 21:28:20

+0

我想你应该修改你的问题,并与单信息进行更新。对于为什么要添加应用程序委托中的按钮更有意义。如果所有相关信息都存在于问题中,它还可以更容易地提供一个良好的答案并理解答案。 – 2010-11-24 21:38:06

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,但努力找出单身物体如何告诉相应的视图控制器停止动画。

我想过尝试使用类似:

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

,但还没有想出的完整过程开始到结束。感谢您提供的任何帮助;

  1. 的viewController设置rightBarItem并启动动画(完成)
  2. 设立NSNotificationCenter监听IAP完成(如果这是实现的最佳途径)
  3. 设立单独的对象NSNotificationCenter播出IAP完成

要在此

通过Mugunth库马尔@http://blog.mugunthkumar.com/coding/introducing-mkstorekit-扩大我使用MKStoreKit 3 -version-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

- (空)provideContent:(的NSString *)产品识别 forReceipt:(NSData的*)receiptData

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

谢谢, 迈克