2013-12-14 2 views
-1

Как получить значение (выбранное состояние) из моих сегментированных элементов управления в tableviewcells? Когда я нажимаю кнопку «Получить состояния», она должна возвращать значение для каждого из сегментированных элементов управления. Я пробовал разные методы, но я не могу найти тот, который работает :(Получить сегментированное значение управления из tableviewcells

Моего кода до сих пор:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

tableData = [[NSMutableArray alloc] initWithCapacity:0]; 
tableData = [NSArray arrayWithObjects:@"First", @"Second", @"Third", nil]; 
} 

- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
UITableViewCell *cell = nil; 
cell = [tableView dequeueReusableCellWithIdentifier:@"StateCell"]; 
if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"StateCell"]; 
} 

//Config cell.. 
cell.textLabel.text = [tableData objectAtIndex:indexPath.row]; 

NSArray *itemArray = [NSArray arrayWithObjects: @"1", @"2", @"3", nil]; 
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:itemArray]; 
segmentedControl.frame = CGRectMake(110, 7, 100, 28); 

[cell.contentView addSubview:segmentedControl]; 

return cell; 
[[self tableView] reloadData]; 
} 

- (IBAction)getStates:(id)sender { 

// Ruturn the current selected statement, for the individual cell's segmentedcontrol.. 
// Ex. First = SelectedState 1, Second = SelectedState 0 & Third = SelectedState 2.. 

} 

Так что я на самом деле прошу, что «Получить состояние "кнопка действие должно сделать ..

Спасибо за ваше время!

Screenshot of what i mean..

+0

Вы сделали это самостоятельно? Или вы просто просите код? –

+0

Привет. Я пробовал всевозможные методы. Так что код будет очень приятным! Мне всего 15, и я довольно новичок в развитии IOS;) –

+0

Пожалуйста, добавьте код, который вы пробовали на свой вопрос, и подробно объясните, какую конкретную часть вы застряли, и что происходит не так. –

ответ

0

В вашем коде есть несколько проблем. Большинство из них происходит потому, что UITableView повторно использует свои ячейки.

Каждый раз, когда отображается ячейка, вы создаете новый UISegmentedControl, чего не следует. Вы должны создать UISegmentedControl только при создании ячейки, переместите этот код в cell == nil).

У вас нет источника данных, который сохраняет состояние сегментов. Вы не должны сохранять состояния в представлениях, особенно если вы работаете с tableView, потому что ячейки повторно используются.

Вот пример, который позволит вам получить необходимую функциональность.

// this is an object of your model, it has a title and saves the selected index 
@interface MBFancyObject : NSObject 
@property (strong, nonatomic) NSString *title; 
@property (assign, nonatomic) NSInteger selectedIndex; 
@end 

@implementation MBFancyObject 
@end 


@interface MasterViewController() { 
    NSMutableArray *_objects;  // stores instances of MBFancyObject 
} 
@end 

@implementation MasterViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // set up the model 
    _objects = [NSMutableArray array]; 
    for (NSInteger i = 0; i < 6; i++) { 
     MBFancyObject *object = [[MBFancyObject alloc] init]; 
     object.title = [NSString stringWithFormat:@"Object #%ld", (long)i]; 
     object.selectedIndex = i % 3; 
     [_objects addObject:object]; 
    } 

    UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:@"Get States" style:UIBarButtonItemStyleBordered target:self action:@selector(logStates:)]; 
    self.navigationItem.rightBarButtonItem = button; 
} 

#pragma mark - Table View 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return _objects.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FancyCell"]; 
    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"FancyCell"]; 
     // add the segmentedControl when you create a new cell 
     UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:@[@"1", @"2", @"3"]]; 
     segmentedControl.frame = CGRectMake(110, 7, 100, 28); 
     [cell.contentView addSubview:segmentedControl]; 

     // add an action so we can change our model if the view changes 
     [segmentedControl addTarget:self action:@selector(didChangeSegmentedControl:) forControlEvents:UIControlEventValueChanged]; 

     // use a tag so we can retrieve the segmentedControl later 
     segmentedControl.tag = 42; 
    } 
    // either if the cell could be dequeued or you created a new cell, 
    // segmentedControl will contain a valid instance 
    UISegmentedControl *segmentedControl = (UISegmentedControl *)[cell.contentView viewWithTag:42]; 

    MBFancyObject *object = _objects[indexPath.row]; 
    cell.textLabel.text = object.title; 
    segmentedControl.selectedSegmentIndex = object.selectedIndex; 
    return cell; 
} 

- (IBAction)didChangeSegmentedControl:(UISegmentedControl *)sender { 
    // transform the origin of the cell to the frame of the tableView 
    CGPoint senderOriginInTableView = [self.tableView convertPoint:CGPointZero fromView:sender]; 

    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:senderOriginInTableView]; 
    NSAssert(indexPath, @"must have a valid indexPath"); 
    MBFancyObject *object = _objects[indexPath.row]; 
    object.selectedIndex = sender.selectedSegmentIndex; 
} 

- (IBAction)logStates:(id)sender { 
    // query the model, not the view 
    for (NSInteger i = 0; i < [_objects count]; i++) { 
     MBFancyObject *object = _objects[i]; 
     NSLog(@"Object \"%@\" - %ld", object.title, (long)object.selectedIndex); 

     // since you have only one section, each indexPath is 0,i 
     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; 
    } 
} 

@end 
+0

Большое спасибо! Я не могу понять, как определить новые ячейки, кроме «Объект № 7» и т. Д. Что, если бы я хотел 20 ячеек с именами, такими как Собака, Кошка, Лошадь ... Надеюсь, ты все еще хочешь мне помочь! Код, о котором я говорю, находится под - (void) viewDidLoad :) –

+0

удалите цикл 'for' в' viewDidLoad' и создайте 'MBFancyObject' для каждой строки вручную. Или сохраните цикл for и получите строки животных из массива, чтобы вы могли заменить stringWithFormat: thingie. –

+0

Спасибо за быстрый ответ! Я думаю, что метод со строками в массиве был бы лучшим и сохранил бы цикл;) Когда вы говорите «или сохраняете цикл for и получаете строки животных из массива, чтобы вы могли заменить stringWithFormat: thingie», это звучит очень просто, но для такого парня, как я, 15 лет, и пока нет образования в разработке приложений, это может быть сложно! : P Я буду продолжать пытаться, но если вы можете привести мне пример, как это сделать = УДИВИТЕЛЬНО !! : D СПАСИБО! –

0

использовать массив для ст все контрольные значения сегментов, а при щелчке по одному элементу управления сегментом просто измените значение соответственно.

0

У вас есть серьезная проблема с повторным использованием здесь

Не когда-либо выделить новый элемент пользовательского интерфейса в tableView:cellForRowAtIndexPath: метод, если он не находится в если условие if (cell == nil)

Изменить Что в Ваш tableView:cellForRowAtIndexPath: быть

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"StateCell"]; 
if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"StateCell"]; 

    // Add the Segmented Control 
    NSArray *itemArray = [NSArray arrayWithObjects: @"1", @"2", @"3", nil]; 
    UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:itemArray]; 
    segmentedControl.frame = CGRectMake(110, 7, 100, 28); 
    segmentedControl.tag = 1; 
    [cell addSubview:segmentedControl]; 
} 

//Config cell.. 
cell.textLabel.text = [tableData objectAtIndex:indexPath.row]; 

// Get that Segmented Control 
UISegmentedControl *segmentedControl = (UISegmentedControl *)[cell viewWithTag:1]; 
segmentedControl.selectedSegmentIndex = 0; // Set your default value here or add your data in an array and read from that array 

return cell; 

Затем в действии кнопки сделайте это

for (UITableViewCell *cell in [tableView visibleCells]) { 
    UISegmentedControl *segmentedControl = (UISegmentedControl *)[cell viewWithTag:1]; 
    NSLog(@"%d",segmentedControl.selectedSegmentIndex); 
} 

Однако этот код не идеален, если у вас нет только 3 ячеек в таблице, чтобы избежать повторного использования или проблемы видимости

Смежные вопросы