自定义委托方法触发正常,但值不会保留在其他方法中

Posted

技术标签:

【中文标题】自定义委托方法触发正常,但值不会保留在其他方法中【英文标题】:Custom delegate method is triggered ok, but values not persist within the other methods 【发布时间】:2012-07-15 16:10:01 【问题描述】:

我是 Objective-c 的新手。我正在做一个带有模态视图的应用程序,它将数据传递给他的父视图。我实现了一个协议委托,并且数据可以正常传递,但它不会在其他方法中持续存在,因为当我尝试使用传递的值做某事时,在我的委托方法之外似乎为空。我在委托方法中做了一个 NSLog 并且值在那里,但是当我想在另一个方法中使用该值时似乎错过了。我没有使用 ARC。

我的主 ViewController.h:

@protocol ModalViewDelegate
- (void)didReceiveWeight:(NSString *)weight andUnit:(NSString *) unit;
@end

@interface LogWeightTableViewController : UITableViewController<ModalViewDelegate> 
NSNumber *weightPassed;


@property (nonatomic, retain) IBOutlet UILabel *WeightSelected;
//...

我的主 ViewController.m:

//...this method is triggered ok, and _weightPassed has the value.
- (void)didReceiveWeight:(NSString *)weight andUnit:(NSString *)unit

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
_weightPassed = [f numberFromString:weight]; //_weightPassed have null in another methods
[f release];

NSString *value = [[[NSString stringWithString:weight] stringByAppendingString:@" "] stringByAppendingString:unit];

[WeightSelected setText:valor];

我的 ModalView.h:

@property (nonatomic, assign) id<ModalViewDelegate> delegate;

我的 ModalView.m:

- (void)viewDidLoad

//...
LogWeightTableViewController *logWeightTVC = [[LogWeightTableViewController alloc]init];
self.delegate = logWeightTVC;

//...when i press a button to go back to main view call the delegate method:
[delegate didReceiveWeight:valor andUnit:unidad];

回到我的 MainViewController。我想用我的 _weightPassed 做点什么:

- (IBAction)saveLogToDataBase:(id)sender 
// ... do some stuff
[row setKg: _weightPassed]; //<-- here _weightPassed is null

我想我错过了一些重要的概念或其他东西,希望有人可以帮助我

【问题讨论】:

那么现在你使用 _datePassed 还是 _weightPassed? 对不起,我现在编辑了代码,它是_weightPassed。 也许使用_weightPassed = [[f numberFromString:weight] retain] 我试过_weightPassed = [[f numberFromString:weight] retain],但结果还是一样 啊,我明白了!每次触发委托方法时,您都在重新创建 logWeightTvc... 这不好,您需要稍微更改您的设计模式。 【参考方案1】:

按照 H2CO3 的建议,我更改了设计模式,现在在显示模式视图之前传递了委托。我是在 prepareForSegue 方法中完成的:

 - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender  
     if ([[segue identifier] isEqualToString:@"modalSegue"]) 
        ModalView *pickerView = [segue destinationViewController]; 
        pickerView.delegate = self; 
    

【讨论】:

以上是关于自定义委托方法触发正常,但值不会保留在其他方法中的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView 点击广告不会触发委托方法

UITableView 原型单元上的自定义附件视图未触发

JS中自定义事件的使用与触发

将 UIViewController 设置为 UITableViewCell 中自定义 UIView 的委托

如何在 django 1.5 中自定义用户模型

如何在 Xcode 5 中自定义默认键盘