2013-11-04 55 views
0

我在故事板中定義了三個原型單元格,每個單元格中包含一個UISegmentedControl小部件。我有兩種標準來向用戶展示;一個是[ON|OFF]另一個是​​。我需要設置每個小部件的文本,因此我在故事板中設置了小部件Tag,以便使用[cell viewWithTag:XX]從正確的原型單元獲取小部件。問題是,我所有的UISegmentedControl小部件都連接到同一個監聽器,我無法告訴用戶打開或關閉哪個標準。我看過Tag的值設置爲cellForRowAtIndexPath中的行號,但我已經在故事板中使用了Tag。如何判斷我的偵聽器正在與哪個行進行交互?使用dequeueReusableCellWithIdentifier時分配UItableView單元格標籤

UPDATE:代碼剪斷添加

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *retcell; 
    NSInteger thisrow = indexPath.row; 

    // retrieve the items which should be printed for this 
    // row. set text on widget depending on item type 
    OBJ_Items *items = [mCriteria objectForKey:thisrow]; 

    if ([items.Type isEqualToString:YESNO]) 
    { 
     retcell = [tableView dequeueReusableCellWithIdentifier:@"yesno"]; 

     // get a handle to the widget in this cell in order to access it's Text property 
     UISegmentedControl *yesno = (UISegmentedControl *)[retcell viewWithTag:200]; 

     // .. set text for yesno segments 

     // save the row numer to this object's tag so we can retrieve the item object 
     // on click 
     [yesno setTag:thisrow]; 

    } 
    if ([items.Type isEqualToString:SETTING]) 
    { 
     retcell = [tableView dequeueReusableCellWithIdentifier:@"setting"]; 
     UISegmentedControl *setting = (UISegmentedControl *)[retcell viewWithTag:201]; 
     // set text for segments... 
     [setting setTag:thisrow]; 
    } 

return (retcell); 
} 
+0

爲什麼你使用標籤來識別原型單元格,你應該使用重用標識符爲該任務。 – ManicMonkOnMac

+0

我不認爲我清楚地解釋了我的問題。我已經重新措辭並添加了一段代碼片段。請看一看。 – wufoo

回答

0

我看來,像你應該做一些UITableViewCell子類爲您YESNO細胞和細胞SETTING。然後在tableView:cellForRow:atIndexPath:中,返回YESNOTableViewCellSETTINGTableViewCell。像這樣:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
    UITableViewCell *retcell; 
    NSInteger thisrow = indexPath.row; 

    // retrieve the items which should be printed for this 
    // row. set text on widget depending on item type 
    OBJ_Items *items = [mCriteria objectForKey:thisrow]; 

    if ([items.Type isEqualToString:YESNO]) 
    { 
     YESNOTableViewCell yesNoCell = [tableView dequeueReusableCellWithIdentifier:@"yesno"]; 

     // .. set text for yesno segments 
     // the UISegmentedControl will be an IBOutlet @property on YESNOTableViewCell 

     // save the row numer to this object's tag so we can retrieve the item object 
     // on click 
     [yesNoCell.segmentedControl setTag:thisrow]; 

     // return the yesNoCell 
     retcell = yesNoCell; 

    } 
    if ([items.Type isEqualToString:SETTING]) 
    { 
     SETTINGTableViewCell settingCell = [tableView dequeueReusableCellWithIdentifier:@"setting"]; 

     // set text for segments... 
     // the UISegmentedControl will be an IBOutlet @property on SETTINGTableViewCell 

     [settingCell.setting setTag:thisrow]; 
    } 

return (retcell); 
} 
+0

嗯..這是一個有趣的方法..所以在我的子類中,我可以簡單地添加一個名爲'setTableRow'或'getTableRow'的方法並相應地設置該屬性?我認爲這可能是我需要在這裏解決的問題。謝謝! – wufoo

+0

我發現的另一種方法是在UISegementedController上使用'addTarget'並檢索選擇器內選定的行。仍然需要在表視圖上實現一個'IBOutlet',但不需要進行子類化。 http://stackoverflow.com/questions/18508183/uitableview-indexpath-row-issue – wufoo

相關問題