2011-09-24 58 views
0

我有一个UITableViewController,我需要时可以实际调用我的超级视图。当我点击表格视图时,我希望信息被放置在UITextField中。现在我可以从超级视图中正确记录日志,但是文本永远不会放在正确的字段中。从UITableView发送信息到SuperView

UITablViewController出发:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
    NSLog(@"Index %i Touched:",indexPath.row); 

    self.MainView = [[TwitterViewController alloc] init]; 
    self.MainView.view = super.view; 

    selectedFriend = [(Tweet*)[friends objectAtIndex:indexPath.row]followingScreenName]; 

    self.MainView.selectedFriendForTweet = self.selectedFriend; 

    [self.MainView setSelectedFriendInBody:self.selectedFriend 
             into:self.MainView.TweetBody 
             with:self]; 

    //NSLog(@"selected name on tblview = %@",selectedFriend); 
    self.MainView.TweetBody.text = self.selectedFriend; 
} 

当你看到当用户点击tblview

[self.MainView setSelectedFriendInBody我的方法被称为:self.selectedFriend 到:self.MainView .TweetBody with:self];

这里是该方法:现在这个日志工程和信息是正确的,但不会进入textview!

-(void)setSelectedFriendInBody:(NSString*)aString into:(UITextView*)atextView with:(id)sender 
{ 
    aString = friendsTbl.selectedFriend; 
    friendsTbl.selectedFriend = self.selectedFriendForTweet; 
    atextView = self.TweetBody; 

    [self.TweetBody setText:selectedFriendForTweet]; 

    NSLog(@"superviews name = %@", selectedFriendForTweet); 
    [selectedFriendForTweet retain]; 
} 

任何帮助将不胜感激!谢谢

回答

1

你在代码中做了一些奇怪的事情。只是一个例子:你的方法setSelectedFriendInBody:into:获得了两个你的实现中没有使用的参数。更糟糕的是:你正在给那些毫无效果的参数赋予一些值。必须有某事错误的... 你的代码做某事像这样:
a=2; b=3; c=10; d=20;
=> f(x,y)=c+d => f(a,b)=30

而且这是一个坏主意(相对于可重用性),以迫使该superview是一个特殊的视图。正确的方法是使用delegate-pattern。只需定义一个协议,该协议应包含您的方法setSelectedFriendInBody:into:并在您的MainView中实现该协议。 TablView只能获取并调用委托(实现协议的ID)。

@protocol MyTablViewDelegate 
-(void)setSelectedFriendInBody:(NSString*)aString; 
@end 

@interface MyTablView : UITableView<UITableViewDelegate> 
{ 
    id<MyTablViewDelegate> myDelegate; 
} 
@property (assign) id<MyTablViewDelegate> myDelegate; //I use assign here for avoiding mem-leaks due to circular retain-chains 
@end 

@implementation MyTablView 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    .... 
    NSString *someString = [(Tweet*)[friends objectAtIndex:indexPath.row]followingScreenName]; 
    NSLog(@"someString: %@", someString); // maybe there is an error in getting that object from array or in followingScreenName 

    [self.myDelegate setSelectedFriendInBody: someString]; 

} 
@end 


@interface MainView : UIView<MyTablViewDelegate> 
... 
@end 

@implementation MainView 
... 
-(void) sthAtLoadTime 
{ 
    MyTablView *mySubView = [[MyTablView alloc] init...]; 
    mySubView.myDelegate = self; 
} 
-(void)setSelectedFriendInBody:(NSString*)aString 
{ 
    if(!self.TweetBody) 
     NSLog(@"ERR: TweetBody not set"); 
    self.TeetBody.text = aString; 

} 
@end 

注意另一件事:我认为你的myTablView也实现了UITableViewDelegatewhich is also not the best way to do

本应该做的工作。

+0

感谢您的回应!我现在正在尝试,并且不通过代理发送信息。一切尽可能的代表去工作,并能够使用主视图中的void语句,但在选择tableview时它永远不会被调用。这是什么得到2011-09-24 19:02:05.278 ThemeCatcher [11717:607] someString:关于管理 2011-09-24 19:02:06.396 ThemeCatcher [11717:607]索引10触摸: 2011-09-24 19:02:06.398 ThemeCatcher [11717:607] someString:Ech0riginal 2011-09-24 19:02:07.866 ThemeCatcher [11717:607]索引12触摸: – FreeAppl3

+0

你是否已经将委托设置为实现?我的意思是'mySubView.myDelegate = self;'这一行,并且这个代码片段叫做?你确定委托方法没有被解雇吗?请用更多的NSLog或断点测试。 – thomas

+0

是的,只是用断点和日志来检查。一切似乎工作,直到实际的委托方法需要被调用! NSLog(@“ERR:TweetBody未设置”);绝不会发生!我在那里放置日志和断点,它永远不会被调用?我在[self.delegate setSelectedFriendInBody:selectedFriend]上得到了一个断点;但不是在superview void委托方法 – FreeAppl3