2011-09-24 72 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