Перезагрузить данные для UIPickerView из другого ViewController

Моя проблема заключается в установке новых данных в мой UIPickerView из другого ViewController. У меня есть main.storyboard (ViewController.h и ViewController.m), у меня есть окно выбора (я называю его aPicker). У меня есть CustomTableViewController для загрузки некоторых изображений. Когда я нажимаю на эти изображения, данные aPicker изменятся.

aPicker в ViewController.m

- (NSInteger)numberOfComponentsInPickerView: (UIPickerView *)pickerView;{
    return 1;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    if(pickerView== aPicker)
    {
        //I will code it later
    }
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;{
    if(pickerView==aPicker)
    {
        return [aPickerAdapter count];
    }
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{

    UIView* tmpView= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 32)];
    UILabel *lbl;

    if(pickerView==aPicker)
    {
        lbl = [[UILabel alloc] initWithFrame:CGRectMake(64, 0, 256, 32)];
        [lbl setText:[aPickerAdapter objectAtIndex:row]];
    }
    [tmpView insertSubview:lbl atIndex:0];

    return tmpView;
}    

Я называю здесь настраиваемую таблицу:

NSMutableArray* tranferData= [[NSMutableArray alloc] init];

[tranferData addObject:aPickerAdapter];
[tranferData addObject:aPicker];
[tranferData addObject:self];
aPicker.delegate=self;
[tranferData addObject:aPicker.delegate];
aPicker.dataSource=self;
[tranferData addObject:aPicker.dataSource];



customTableViewController=[[CustomTableViewController alloc] initWithNibName:@"CustomTableViewController" bundle:[NSBundle mainBundle] set:tranferData];
customTableViewController.delegate=self;

[self.view addSubview:customTableViewController.view]; 

Получить в CustomTableViewController.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil set:(NSMutableArray *)myarray{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        myArray=myarray;
        // Custom initialization on passed parameter observation object
        aPickerAdapter=[myarray objectAtIndex:0];
        aPicker=[myarray objectAtIndex:1];
        tranferSeft=[myarray objectAtIndex:2];
        pickerDelegate=[myarray objectAtIndex:3];
        pickerDataSource=[myarray objectAtIndex:4];
    }
    return self;
}

Когда коснитесь изображения в таблице

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSString *string= [@"tap to row " stringByAppendingString:[NSString stringWithFormat:@"%d",indexPath.row]];
    NSLog(string);

    //NSString *str= [onlineIdList objectAtIndex:indexPath.row];
    //UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Demo" message:str delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];

    //[alert show];

    NSMutableArray *testArr= [[NSMutableArray alloc]init];
    [testArr addObject:@"2"];
    [testArr addObject:@"4"];
    [testArr addObject:@"6"];

    //aPicker.delegate= pickerDelegate;
    //aPicker.dataSource= pickerDataSource;

    **aPickerAdapter=testArr;
    [aPicker reloadAllComponents];**

    [self hideAndShowSubChannel];//this funtion is to hide and show aPicker, defaut aPicker is hide, on first tap it will show([aPicker setHidden:NO]), and it hide on second tap....
}

Когда я нажимаю на изображение, средство выбора только скрывается и отображается (я думаю, это означает, что моя программа может понимать указатель на aPicker), но он не может добавлять данные из моего testArr в aPicker, я также пытаюсь сбросить полученный делегат и источник данных, это пока не работает. Я тестирую с тем же кодом (создайте testArr, установите aPickerAdapter, reloadAllComponent ...) в ViewController.m, он работает. Почему я не могу его перезагрузить? Помоги мне, пожалуйста!

ps: Я новичок и плохо говорю по-английски. Если у меня есть ошибка, пожалуйста, простите меня, спасибо


person Huy Hóm Hỉnh    schedule 14.10.2014    source источник
comment
Вы говорите: «Когда я нажимаю на изображение, средство выбора только скрывает и показывает». Оба контроллера представления отображаются одновременно?   -  person kelin    schedule 14.10.2014
comment
Не могли бы вы подробнее объяснить свой код или добавить фрагмент кода из объявления о свойстве? Например, что такое aPickerAdapter ...   -  person TMob    schedule 14.10.2014
comment
привет, aPickerAdapter - это NSMutableArray. Он содержит данные для aPicker (вы можете увидеть его на numberOfRowsInComponent и viewForRow). Я думаю, дело в aPickerAdapter, возможно, указатель на aPickerAdapter в ViewController.m и aPickerAdapter в CustomTableViewController.m не равны. Но я не знаю, как с этим справиться :(   -  person Huy Hóm Hỉnh    schedule 14.10.2014
comment
@kelin: У меня есть только раскадровка. Все загружается автоматически, в том числе и моя настраиваемая таблица. Когда он появился, я нажимаю изображение в табличном представлении, aPicker будет отображаться (и скрывать- ›показывать-› скрывать .... каждое нажатие). : D   -  person Huy Hóm Hỉnh    schedule 14.10.2014
comment
@ HuyHómHỉnh, вы хотите сказать, что вы даже не запускаете свое приложение на симуляторе? : D   -  person kelin    schedule 14.10.2014
comment
@kelin: извините, если я не понимаю, что вы имеете в виду. Бегу на тренажере. «Автоматически» означает, что когда я нажимаю кнопку «Выполнить» в Xcode, все это отображается перед моими глазами (я ничего не делаю для загрузки). Мое первое действие - нажать на изображение, чтобы увидеть пикер. Ты понимаешь?   -  person Huy Hóm Hỉnh    schedule 14.10.2014
comment
@ HuyHómHỉnh, да, я знаю. Я попросил об этом, чтобы убедиться, что ViewController загружен в память. Как получить доступ к aPickerAdapter переменной ViewController в -tableView:didSelectRowAtIndexPath: методе CustomTableViewController?   -  person kelin    schedule 14.10.2014
comment
Я добавляю его в tranferData (во вторых блоках кода), отправляю в настраиваемую таблицу и получаю в третьем блоке кода. Но я не знаю, как отправить данные обратно :(   -  person Huy Hóm Hỉnh    schedule 14.10.2014


Ответы (3)


Я бы поступил иначе. Вы пытаетесь заставить свой TableViewController напрямую обновлять представление другого контроллера представления - вам не следует этого делать. Вместо этого вам нужно передать данные обратно вашему первому контроллеру представления, чтобы он мог обновлять свои собственные представления. Для этого существуют различные методы (см. эту ссылку), но в ваших обстоятельствах я бы реализовать метод в вашем контроллере представления и вызвать его из своего настраиваемого TableViewController:

В ViewController:

-(void)updatePicker:(NSArray *)newArray {
    aPickerAdapter = testArr;
    [aPicker reloadAllComponents]
    // and do anything else you need
}

В вашем методе CustomerTableViewController didSelectRow:

[self.delegate updatePicker:testArr];
person pbasdf    schedule 14.10.2014
comment
Я понимаю ваш путь, но не знаю, как вызвать метод updatePicker (в Viewcontroller.m) из CustomTableViewController.m. Я не могу понять, что означает seft.delegate? seft в didSelectRow будет означать CustomTableViewController? Спасибо! - person Huy Hóm Hỉnh; 14.10.2014
comment
Да, self в didSelectRow будет относиться к customTableViewController. Но вы устанавливаете свойство delegate сразу после его создания (customTableViewController.delegate=self). Эта строка находится в вашем главном контроллере представления, поэтому self здесь относится к контроллеру главного представления. Следовательно, в вашем customTableViewController, self.delegate относится к вашему контроллеру основного представления. - person pbasdf; 14.10.2014

Я решил это с помощью @pbasdf и его ссылки (ответ @ Мэтт Прайс действительно пригодился). Всем спасибо: D

person Huy Hóm Hỉnh    schedule 15.10.2014

Попробуйте реализовать метод UIPickerViewDelegate-Method

  • (NSString *) pickerView: (UIPickerView *) pickerView titleForRow: (NSInteger) row forComponent: (NSInteger) component;

вместо метода viewForRow.

Например так:

- (NSString *)pickerview:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{    
    return [aPickerAdapter objectAtIndex:row];
}
person TMob    schedule 14.10.2014
comment
При наличии viewForRow titleForRow может не работать. Я использовал viewForRow, потому что мне нужно настроить этот сборщик. Об указании делегата и источника данных в раскадровке, это перетаскивание в контроллер представления (желтая кнопка над дизайном экрана на раскадровке)? Спасибо - person Huy Hóm Hỉnh; 15.10.2014
comment
Извините, комментарий об источнике данных / делегате был неверным. Я что-то неправильно понял. - person TMob; 15.10.2014