Iphone UIView 父方法调用

Posted

技术标签:

【中文标题】Iphone UIView 父方法调用【英文标题】:Iphone UIView parent method call 【发布时间】:2011-04-14 17:05:47 【问题描述】:

我遇到了一个问题....请帮忙!

我有一个导航控制器项目。从根控制器,我将一个视图推送到具有一些信息和 2 个按钮(是,否)的堆栈上。 (它不能是 AlertView)。如果他们按下是按钮,我会调用父视图上的一个方法(使用委托方法)并从堆栈中弹出视图。父级上的方法将新视图推送到堆栈上。我假设父方法在子视图释放后将保留在内存中,因为该方法存在于父视图中,但是当子视图被释放时,它也会释放在父视图中创建的所有内容。有没有人有解决方案来响应父视图中子视图上发生的事件,该事件在子视图被释放后仍将保留?

谢谢!

在头文件中:

#import <UIKit/UIKit.h> 

@protocol decrementDelegate; 
@interface decrement : UIViewController  
    int currentCount; 
    IBOutlet UILabel *countLabel; 
    id <decrementDelegate> delegate; 
 
@property (nonatomic, assign) id <decrementDelegate> delegate; 
@end 

@protocol decrementDelegate <NSObject> 
-(void)decrementControllerDidFinish:(decrement *)controller 
        withString:(NSString *)stringValue; 
@end 

在实现文件中:

[self.delegate decrementControllerDidFinish:self 
    withString:countLabel.text]; 
[self.navigationController popViewControllerAnimated:YES];

来电者:

-(void)decrementControllerDidFinish:(decrement *)controller 
    withString:(NSString *)stringValue  

    // Show our details  
    myNewChildController *viewController = [[myNewChildController alloc] 
        initWithNibName:@"myNewChildController" bundle:nil]; 
    viewController.delegate = self; 
    [self.navigationController pushViewController:viewController animated:YES]; 
    [viewController release]; 

使用非委托并仅在父级上调用方法:

来电者:

mySummary *parent = [self.navigationController.viewControllers objectAtIndex:0];
[mySummary setMyAllowOnParent:@"Allowed"]; 
[self.navigationController popViewControllerAnimated:YES]; 

父母:

-(void)setMyAllowOnParent:(NSString *)aAllow  
newView *viewController = [[newView alloc] initWithNibName:@"newView" bundle:nil];  
[self.navigationController pushViewController:viewController animated:YES]; 
[viewController release]; 

当调用者视图被释放时,newView 崩溃并出现释放错误。有谁知道如何解决这个问题?

【问题讨论】:

【参考方案1】:

您是如何创建代理的?您没有意外使用 retain 而不是 assign (假设您使用属性来访问它)?因为如果您使用了保留,这可能会导致问题。

顺便说一句,您提到了一些无法使用的 UIAlertView,这使我认为您创建的视图与 UIAlertView 的设计相似。也许以下链接可能有用:

how can i make popup login window similar as on istore in objective-C/cocoa-touch

【讨论】:

Wolgang,感谢您的快速回复。这是我的委托@interface 递减: UIViewController id delegate; @property (nonatomic, assign) id 委托; -(void)decrementControllerDidFinish:(decrement *)controller withString:(NSString *)stringValue;我不能使用 UIAlertView,因为我创建的 UIView 将它自己的视图推送到堆栈上。我想有人可能会建议 能否再显示一些代码?我猜你使用实例变量来跟踪委托,你能告诉我这个 ivar 的所有相关代码吗? 编辑: 似乎您刚刚对其进行了编辑,似乎代理已正确创建。您能否将您的代码添加到您的主要问题中,以便我可以看到它的格式?我还想看看你用来弹出视图控制器的代码。 Wolfgang,子标题:#import @protocol decrementDelegate; @interface 递减:UIViewController int currentCount; IBOutlet UILabel *countLabel; id 委托; @property (nonatomic, assign) id 委托; @end @protocol decrementDelegate -(void)decrementControllerDidFinish:(decrement *)controller withString:(NSString *)stringValue; @end child m: [self.delegate decrementControllerDidFinish:self withString:countLabel.text]; [self.navigationController popViewControllerAnimated:YES]; parent: -(void)decrementControllerDidFinish:(decrement *)controller withString:(NSString *)stringValue // 显示我们的详细信息 myNewChildController *viewController = [[myNewChildController alloc] initWithNibName:@"myNewChildController" bundle :零]; viewController.delegate = self; [self.navigationController pushViewController:viewController Animation:YES]; [viewController 发布]; myNewChildController 与原始子视图一起被释放

以上是关于Iphone UIView 父方法调用的主要内容,如果未能解决你的问题,请参考以下文章

UIView的layoutSubviews和drawRect方法何时调用

iPhone UIView touchesMoved: withEvent: 不会在 UIView 上使用手势识别器调用

动画 UIView 调用方法

UIView、UIScrollView 和 UITextFields 问题调用方法

iOS:UIView子类init会调用[super init]然后调用超类中的方法,为啥会调用[subclass initWithFrame:xx]?

UIView的layoutSubviews和drawRect方法何时调用