Вопрос по global-variables, xcode, objective-c, tableview – Использовать выбранную строку в другом классе

1

это, я думаю, основная проблема, потому что stackoverflow полон этого и ofc google тоже. Но ничто не помогло мне. Мне нужно передать целочисленный vaule, который говорит, какая строка выбрана, в другой класс. Вот мой код:

TableViewController.h

#import 

@interface TableViewController : UIViewController 

{
    NSArray *tabledata;
}
@property (nonatomic, retain) NSArray *tabledata;
@property (strong, nonatomic) IBOutlet UITableView *tableView;
@property(nonatomic) NSInteger selectedRow;

@end

TableViewController.m

#import "Instruments.h"

@interface Instruments ()

@end

@implementation Instruments
@synthesize tabledata;
@synthesize tableView;
@synthesize selectedRow;

- (void)viewDidLoad
{
    [super viewDidLoad];
    tabledata = [[NSArray alloc] initWithObjects:@"Row1", @"Row2", @"Row3", nil];
    self.selectedRow = 0;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [tabledata count];
}

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

    cell.textLabel.text = [tabledata objectAtIndex:indexPath.row];

    if (indexPath.row == self.selectedRow)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;
}

- (void)tableView:(UITableView *)tableview didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row != self.selectedRow) {
        self.selectedRow = indexPath.row;
    }

    [tableView reloadData];
}


- (void)viewDidUnload {
    [self setTableView:nil];
    [super viewDidUnload];
}
@end

FirstViewController.h

//Some code which calls my variable 'selectedrow'
...

FirstViewController.m

...
if selectedrow = 0 {
//some code
}
if selectedrow = 1 {
//some code
}
if selectedrow = 2 {
//some code
}
...

Как мне объявить мою переменную?selectedrow» чтобы иметь возможность использовать его в FirstViewController?

Ваш Ответ

2   ответа
1

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

Заголовок: MyAppModel.h

@interface MyAppModel // <<<=== Use an appropriate name here
+(MyAppModel*)instance;
@property (readwrite) NSInteger selectedRow;
@end

Реализация: MyAppModel.m

@implementation MyAppModel
+(MyAppModel*)instance {
    static MyAppModel *statInst;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        statInst = [[MyAppModel alloc] init];
    });
    return statInst;
}
@synthesize selectedRow;
@end

Использование: ваши контроллеры просмотра '

// Set the selected row
[MyAppModel instance].selectedRow = indexPath.row;

// Access the last selected row
switch ([MyAppModel instance].selectedRow) {
    case 1: // some code
    break;
    case 2: // some code
    break;
    case 3: // some code
    break;
}
@TomasJ Ах, тыВерно, я заменил последовательностьifсswitch, но неправильно понял мои константы. dasblinkenlight
Тот'сидеть! Большое спасибо! Но в этом коде есть одна маленькая ошибка. Первый случай должен быть.case 0 TomasJ
@ TomasJ Чтобы использовать это, оба контроллера представления должны импортировать"MyAppModel.h" заголовок (или любое другое имя, которое вы дали своей модели). Настройка выбранной строки входит в ваш контроллер представления таблицыdidSelectRowAtIndexPath:,switch идет к первому контроллеру просмотра. dasblinkenlight
Я немного запутался в последней части кода (Использование). Где я должен установить выбранную строку? Помещение в FirstViewController.h / m выдает ошибку, но ям сто уверен, что яя ставлю это в неправильном месте: D TomasJ
1

TableViewController но не дляFirstViewController

Итак, вTableViewController когда вы представляете FirstViewController 's view, также установите значение. Например,

 FirstViewController* newObject = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
 newObject.selectedIndex = self.selectedIndex;   //Here self indicates the present class which is `TableViewController`
 //Now whatever your insertion method.  i.e
 [self.navigationController pushViewController:newObject animated:Yes];
 // or presenting your modal view controller, this depends totally on you.

Надеюсь, поможет! :)

Похожие вопросы