【问题标题】:How to use Protocols objective-c如何使用协议objective-c
【发布时间】:2012-12-18 10:26:22
【问题描述】:

我需要将 Picker 选择的值继承到另一个地方。我正在尝试下面的代码,但 null 值即将到来。请检查我哪里出错了。 我必须继承 PickerView.. 中传递的字符串值。请检查代码

Picker1.h

#import <UIKit/UIKit.h>

@protocol pickerDelegate <NSObject>
-(void)didFinishPicking:(NSString *)pickedStr;

@end
@interface
@property(nonatomic,retain)id<pickerDelegate>delegate;

picker.m

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {


 string=[NSString stringWithFormat:@"%@",[list objectAtIndex:row]];

 label.text=string;

 [self.delegate didFinishPicking:string];


}


- (void)viewDidLoad
 {
[super viewDidLoad];


list =[[NSMutableArray alloc]init];
[list addObject:@"a"];
[list addObject:@"b"];    

}

Acitivity_1.h

 #import <UIKit/UIKit.h>
#import "Picker1.h"
@interface Activity_1 : UIViewController<UIApplicationDelegate, pickerDelegate>{

@property(nonatomic,retain)Picker1 *delegate1;
@property (nonatomic,retain)NSString *str;

@end

Activity_1.m

- (void)viewDidLoad
{
[super viewDidLoad];
 **this is how i print the value but value is null**
 NSLog(@"delegate1%@",self.delegate1.string);


delegate1 = [[Picker1 alloc] init];

[delegate1 setDelegate : self];


}

-(void)didFinishPicking:(NSString *)pickedStr
{
[self setStr:pickedStr];
}

【问题讨论】:

  • 请阅读有关Protocols的文档
  • 是的,我已经读过这个..但是你能告诉我我的代码哪里错了
  • 然后尝试阅读有关Delegates 的文档
  • yaone 一件事我很困惑,我在picker1的didselectrow中定义了代表......并在viewdidload中返回......是否可能......即使我尝试了-(void)applicationWillBecomeActive:(NSNotification *)通知;...不起作用
  • 您没有在 didselectRow 方法中定义您的委托,而是在您的委托上调用了一个方法。当你调用这个时,你的代理的设置就会发生:[delegate1 setDelegate : self];

标签: iphone ios ios5 inheritance protocols


【解决方案1】:

您在设置委托之前打印出一个委托的值....所以它将打印空值。您应该在调用 didFinishPicking 方法时打印出您的字符串,因为这是您设置字符串的地方。

-(void)didFinishPicking:(NSString *)pickedStr
{
    [self setStr:pickedStr];

    // print the string you have just picked here if you want
    NSLog(@"Picked string: %@",pickedStr);
}

注意一边:避免任何带有数字的命名约定,例如 Activity_1、Picker1,这是非常糟糕的代码实践。

【讨论】:

  • 不,如果我在这里使用...它甚至不显示delegate1or null..我认为..方法没有被调用
  • 你在 didFinishPicking 方法中调试了吗?
  • 您的 didSelectRow 方法是否至少在 self.delegate 不为空的情况下被调用?
  • 你的意思是我应该 nslog in Didselectrow... NSLog(@"did select %@",self.delegate);...它的 null
  • 这意味着当您在 Didselecthrow 方法中调用它时,您的委托未设置。由于它为 null,因此不会调用 didFinishPicking 方法。
【解决方案2】:

在创建 self.delegate1 之前,您是 NSLogging 委托 请使用以下代码行。

delegate1 = [[Picker1 alloc] init];
[delegate1 setDelegate : self]; 

并将 NSLog 放入“didFinishPicking”

-(void)didFinishPicking:(NSString *)pickedStr
{
 NSLog(@"pickedStr%@", pickedStr);
 [self setStr:pickedStr];
}

【讨论】:

  • 是的,因为在视图 didLoad 方法中甚至没有设置字符串的委托,但 self.delegate1 至少不为空
  • 是的,我这样做了...但是 NSLog(@"pickedStr%@", pickedStr); 未被调用 ...didFinishPicking 未被调用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2014-12-15
  • 2011-06-05
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多