2

我正在splitView为我的iPad. 我已经实现了一个UIButton称为 as 的Upload。单击它时, aUITableView出现在 aUIPoverController中。单击任何内容时,我想在我UIwebView的 in 中显示一些相应的站点UIDetailView。为此,我实施了一个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我实现该功能的类文件中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];
 }

但是,我无法在 gdb中获取hello(写在函数中Selected) 。NSLogged这是我第一次使用这个delegate method protocol。我无法解决这个问题。有人可以帮我吗 ?谢谢并恭祝安康。

4

2 回答 2

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

此外,您的委托被声明为保留,这在 ObjC 中是绝对禁止的。如果使用 ARC,则声明是弱的,如果不是,则分配。

您还-uploadPressed:通过在显式拥有或初始化对象之前设置它来在您的方法中生成一个 nil 委托。这是它的外观:

self.Upload = [[UploadSpaceTableViewController alloc]initWithStyle:UITableViewStylePlain];
Upload.delegate = self;
于 2012-06-28T08:41:06.583 回答
4

委托是这样工作的

  • 声明一个协议 - 你已经这样做了
  • 声明一个委托属性 - 你已经这样做了
  • 在你想成为代表的类中说它符合协议

    @interface MyClass : MySuperClass <UploadTableViewDelegate>

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

    uploadSpaceTVC.delegate = self;

  • 调用非委托类中的委托方法(UploadSpaceTableViewController

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

于 2012-06-28T08:53:24.517 回答