2012-07-17 27 views
0

我是新來的xcode和使我的第一個iPhone應用程序。如何將選定的行從UITableview保存到NSString變量?

我有一個標籤式屏幕UITableview 8行。我有一個代碼,讓用戶一次選擇最多4行,並在選中時用檢查標記它。

現在,當我更改視圖並導航到下一個選項卡時,我想將這些檢查行中的文本保存在由逗號分隔的單個NSString變量中。

有沒有可能這樣做?謝謝,非常感謝您的幫助。

這是第一個選項卡從那裏我想保存選定行的代碼。

@implementation Psychological 

static int count = 0; 
- (void)viewDidLoad { 
[super viewDidLoad]; 

listOfItems = [[NSMutableArray alloc] init]; 

[listOfItems addObject:@"1 option"]; 
[listOfItems addObject:@"2 option"]; 
[listOfItems addObject:@"3 option"]; 
[listOfItems addObject:@"4 option"]; 
[listOfItems addObject:@"5 option"]; 
[listOfItems addObject:@"6 option"]; 
[listOfItems addObject:@"7 option"]; 
[listOfItems addObject:@"8 option"];  

} 
#pragma mark - 
#pragma mark Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
// Return the number of sections. 
return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  { 
// Return the number of rows in the section. 
return [listOfItems count]; 
} 


// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 


// Configure the cell... 
NSString *cellValue = [listOfItems objectAtIndex:indexPath.row]; 
cell.text = cellValue; 



return cell; 
} 


#pragma mark - 
#pragma mark Table view delegate 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 
if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) { 
    if(count < 4) 
    { 
    [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    [selectedIndexes addObject:[NSNumber numberWithInt:indexPath.row]]; 
     count++; 
    } 

} else { 
    [selectedCell setAccessoryType:UITableViewCellAccessoryNone]; 
    [selectedIndexes removeObject:[NSNumber numberWithInt:indexPath.row]]; 
    count --; 
} 
[tableView deselectRowAtIndexPath:indexPath animated:NO]; 

} 


- (void)dealloc { 

[listOfItems release]; 
[super dealloc]; 
} 


@end 

回答

4

最簡單的方法是讓法至極將返回你需要的字符串。法會是這個樣子:

- (NSString *) selectedItems { 
    NSMutableString *result = [NSMutableString string]; 
    for (int i = 0; i < [itemsArray count]; i++) { 
     NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:0]; 
     [tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; 
     UITableViewCell *cell = [tableView cellForRowAtIndexPath:path]; 
     if (cell.accessoryType == UITableViewCellAccessoryCheckmark) { 
      [result appendFormat:@"%@",cell.textLabel.text]; 
     } 
    } 
    if (result.length > 2) { 
     [result replaceCharactersInRange:NSMakeRange(result.length-1, 1) withString:@""]; 
    } 
return result; 
} 

要獲得另一個視圖控制器這一行,你應該在navigationController.viewController找到心理視圖控制器,並調用此方法。

- (void) method { 
    for (UIViewController *vc in self.navigationController.viewControllers) { 
     if ([vc isKindOfClass:[Psychological class]]) { 
      NSString *str = vc.selectedItems; 
     } 
    } 
} 
+0

嗨,這正是我正在尋找的。我只是沒有得到在哪裏調用這個方法? 這應該在下一個標籤中調用嗎?如果是這樣的話?對不起,這個愚蠢的問題,我真的很新的xcode! – 2012-07-17 12:09:07

+0

是在下一個選項卡中。我認爲你需要在viewWillAppear:方法中調用它。 – Moonkid 2012-07-17 12:12:08

+0

謝謝,在上面的代碼中,它給出了一個錯誤,說tableView未聲明? – 2012-07-17 13:18:12

0

您可能想擁有一個全局數組。 將所選值存儲到該全局數組中,然後在其他地方顯示它們將很容易。:-)

0

創建一個新類,我們將其稱爲Option,並給它兩個屬性。一個是名爲name的NSString,另一個是名爲selected的BOOL。而不必listOfItems爲字符串數組,使其Option對象的列表。讓每個Option跟蹤它是否當前被選中。

將擁有listOfItems的控制器類設置爲UITabBarControllerDelegate並執行tabBarController:didSelectViewController:,以便構建字符串並將其傳遞給下一個選定的控制器。

1

希望下面的代碼適合您的要求:

// didSelect方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath { 

    UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 

    if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) { 

    if(count < 4) { 

     [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark]; 
     [selectedIndexes addObject:[NSNumber numberWithInt:indexPath.row]]; 
     count++; 
    } 

    } else { 

    [selectedCell setAccessoryType:UITableViewCellAccessoryNone]; 
    [selectedIndexes removeObject:[NSNumber numberWithInt:indexPath.row]]; 
    count --; 
} 

    [tableView deselectRowAtIndexPath:indexPath animated:NO]; 
} 

聲明selectedCell全球將所有選項卡訪問

NSMutableString *selectedCell = [[NSMutableString alloc]init]; //Should declare this string globally 

//使用下面的代碼-viewWillDisappear方法或者你覺得它適合(方法從本類導航時調用)

for(int i = 0; i < [selectedIndexes count]; i++){ 

[selectedCell appendString:[selectedIndexes objectAtIndex:i]; 
[selectedCell appendString:@","]; 

} 

NSRange range = {[selectedCell length]-1,1}; 
[selectedCell deleteCharactersInRange:range]; 
+1

嗨,感謝您的回覆,但不會將所有選定的行添加到字符串中(其中將包括已選中和未選中的行)? – 2012-07-17 13:20:37

+0

不要在didSelect委託方法中使用這部分代碼,而是在所有選擇完成後使用它。 SelectedIndexes數組將保存最終選擇(從-didSelect方法返回)。但如果你仍然想在didSelect方法中使用它,請嘗試新編輯的代碼 – 2012-07-17 14:04:59

1
NSMutableString *selectedRow=[NSMutableString alloc]init]; 

for(int i=0; i<[count];i++) 
{ 
    selectedRow=[arrayName objectAtIndex:row]; 
    [selectedRow appendString:@","]; 
} 
1
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

    UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 

    if (selectedCell.accessoryType == UITableViewCellAccessoryNone) { 
if(count<4){ 
     selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; 
     [[listOfItems objectAtIndex:indexPath.row]setObject:@"YES" forKey:@"Selected"]; 
count++; 
} 

    } else if (selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) { 
     if(count>=0){ 
     selectedCell.accessoryType = UITableViewCellAccessoryNone; 
     [[listOfItems objectAtIndex:indexPath.row]setObject:@"NO" forKey:@"Selected"]; 
count--; 
    } 
} 

替換上面的代碼,當你想在那個時候檢查瀏覽您的網頁是否選定值yes或no,如果是,那麼傳遞價值,否則離開它。

for (int i =0 ; i<[listOfItems count]; i++) { 
     if ([[[listOfItems objectAtIndex:i]valueForKey:@"Selected"]isEqualToString:@"YES"]) { 
      if ([selectedId length]==0) { 
       selectedId = [NSString stringWithFormat:@"%@",[[listOfItems objectAtIndex:i]valueForKey:@"user_id"]]; 
      }else { 
       selectedId = [selectedId stringByAppendingFormat:@",%@",[[listOfItems objectAtIndex:i]valueForKey:@"user_id"]]; 
      } 
     } 
    } 
相關問題