委托方法协议不起作用 - 目标C.

时间:2012-06-28 08:38:46

标签: iphone objective-c ios xcode ipad

我正在为splitView申请iPad申请。我已经实现了一个名为UIButton的{​​{1}}。点击它后,Upload内会显示UITableView。点击任何内容后,我想在UIPoverController的{​​{1}}中显示一些相应的网站。为此,我实施了UIwebView。我在UIDetailView file ::

中使用了以下代码行
delegate method protocol

在相应的UploadTableViewController.h文件中,我使用了以下代码行::

@protocol UploadTableViewDelegate <NSObject>
@required
- (void)selected:(NSString *)his;
@end


 @interface UploadSpaceTableViewController : UITableViewController{
id<UploadSpaceTableViewDelegate> delegate;
}

@property (retain) id delegate;
@end

在我已实现函数.m的类的- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (delegate != nil) { NSString *hisSelected = [keys objectAtIndex:indexPath.row]; NSLog(@"%@ lolwa", hisSelected); [delegate selected:hisSelected]; } } 文件中,代码为::

.m

但是,我无法在gdb中获取Selected(在函数- (void)selected:(NSString *)Key { NSLog(@"hello"); [self.UploadSpaceTableViewPopover dismissPopoverAnimated:YES]; } -(IBAction)uploadpressed:(id)sender{ Upload.delegate = self; self.Upload = [[UploadSpaceTableViewController alloc] initWithStyle:UITableViewStylePlain]; self.UploadTableViewPopover = [[UIPopoverController alloc] initWithContentViewController:UploadSpace]; [self.UploadTableViewPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } 中编写)hello。这是我第一次使用此Selected。我无法解决这个问题。有人可以帮我吗 ?谢谢和问候。

2 个答案:

答案 0 :(得分:5)

[delegate keySelected:hisKeySelected];是您的第一个问题。您没有声明名为-keySelected:的委托方法,而是声明名为-Selected:的委托方法。

您的第二个问题是您绝对不是表格视图的代表。为了调用-didSelectRowAtIndexPath:之类的委托方法,您必须是表的委托。

PS,不要用大写字母开始实例或方法名称。在ObjC中,大写字母表示一个类。

编辑:这就是您的UploadSpaceTableViewController标题应该是这样的:

@protocol UploadTableViewDelegate <NSObject>
@required
- (void)selected:(NSString *)his;
@end

@interface UploadSpaceTableViewController : UITableViewController<UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, assign) id <UploadSpaceTableViewDelegate>delegate; //delegates are weak!!!
@end

而.m,我会跳过很多不必要的东西:

-(void)viewDidLoad {
    [self.tableView setDelegate:self];
    [self.tableView setDataSource:self];
}
//other code

此外,您的委托被声明为retain,这在ObjC中是绝对的No-No。如果使用ARC,则声明为弱,如果不使用则声明为。

通过在明确拥有或初始化对象之前设置它,您还在-uploadPressed:方法中生成了一个nil委托。以下是它的外观:

self.Upload = [[UploadSpaceTableViewController alloc]initWithStyle:UITableViewStylePlain];
Upload.delegate = self;

答案 1 :(得分:3)

代表团的工作方式如下

  • 声明一个协议 - 你已经完成了这个
  • 声明委托属性 - 您已完成此操作
  • 在您希望成为委托的类中,说它符合protocoll

    @interface MyClass : MySuperClass <UploadTableViewDelegate>

  • 设置委托属性,以便委托类可以获取委托消息

    uploadSpaceTVC.delegate = self;

  • 调用非委托类(UploadSpaceTableViewController

    中的委托方法

    [self.delegate selected:@"test"];