Скрыть UIButton в пользовательской UITableViewCell

В моем табличном представлении у меня есть несколько разных пользовательских ячеек. В одном из них есть кнопка. Эта кнопка вызывает другой контроллер представления. Однако это не требуется, пока табличное представление не будет полностью загружено. В cellForRowAtIndexPath я настроил все свои различные пользовательские ячейки. Я могу раскомментировать [buttonCell.myButton setHidden:YES]; и он скроет мою кнопку. Смотри ниже.

else if (indexPath.section == 3)
{
    ButtonCell *buttonCell = [tableView dequeueReusableCellWithIdentifier:@"ButtonCell"];

    //[buttonCell.myButton setHidden:YES];
    cell = buttonCell;
}
    return cell;

Однако я хочу затем показать кнопку после загрузки таблицы. Я заканчиваю загрузку всех своих массивов в другом методе, где я вызываю reloadData. В этом методе я попытался показать кнопку, сделав это.

[ButtonCell.myButton setHidden:NO];

Но компилятор выдает мне предупреждение, что свойство myButton не найдено в ButtonCell. У кого-нибудь есть идеи, как показать мою кнопку. Что я делаю не так, и что у меня не получается! Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ 1

Мой класс кнопочных ячеек... .h #import

@interface ButtonCell : UITableViewCell

@property (strong, nonatomic) IBOutlet UIButton *myButton;
- (IBAction)YDI:(id)sender;


@end

.m

#import "ButtonCell.h"
#import "AnotherWebViewController.h"

@implementation ButtonCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
    // Initialization code
}
return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];

// Configure the view for the selected state
}

- (IBAction)YDI:(id)sender
{

}

@end

РЕДАКТИРОВАТЬ 2

С помощью всех, кто ответил (спасибо всем), я продвинулся немного дальше, но кнопка не показывает себя. Поэтому я все еще прячу кнопку в cellForRowAtIndexPath, которая работает как надо. Затем в моем методе, в котором я перезагружаю данные, я помещаю следующий код.

NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:3];
ButtonCell *buttonCell = (ButtonCell *) [self.tableView cellForRowAtIndexPath:index];
[buttonCell.myButton setHidden:NO];

ButtonCell с кнопкой всегда является четвертым разделом (считая первый за 0) и имеет только одну строку. Любая другая помощь будет оценена по достоинству. Почти готово!

РЕДАКТИРОВАТЬ 3 Понял! Однако именно благодаря комментарию я смог это понять. Спасибо @A-Live. Хотя я знаю, как получить ячейку методом вне cellForRowAtIndexPath благодаря ElJay. Так что я даю ему чек, так как я узнал что-то новое, поэтому мы все равно публикуем вопросы. Итак, внутри моего метода cellForRowAtIndexPath я скрываю/показываю кнопку. У меня есть BOOL в моем приложении, называемом завершенным, изначально для него установлено значение true. Когда табличное представление завершает загрузку, для него устанавливается значение false. Поэтому я просто использовал это логическое значение, чтобы показать/скрыть кнопку.

else if (indexPath.section == 3)
{
    ButtonCell *buttonCell = [tableView dequeueReusableCellWithIdentifier:@"ButtonCell"];

    if (!_finished)
    {
        [buttonCell.myButton setHidden:YES];
    }else{
        [buttonCell.myButton setHidden:NO];
    }

    cell = buttonCell;
}
    return cell;

И снова это только часть моего метода cellForRowAtIndexPath. Еще раз спасибо за помощь. Я был удивлен, увидев так много ответов! Спасибо.


person Douglas    schedule 12.06.2013    source источник
comment
Тип есть? Я не верю, что код должен компилироваться.   -  person A-Live    schedule 12.06.2013
comment
покажите нам класс ButtonCell .h   -  person Lithu T.V    schedule 12.06.2013
comment
@LithuT.V, я включил класс ButtonCell.   -  person Douglas    schedule 12.06.2013
comment
@A-Live, опубликованный код является лишь частью моего метода cellForRowAtIndexPath.   -  person Douglas    schedule 12.06.2013
comment
Поскольку вы всегда прячете кнопку в cellForRowAtIndexPath, вы, естественно, ее не увидите, вам нужно показать кнопку и там.   -  person A-Live    schedule 13.06.2013
comment
@A-Live, ВАУ! Это сделало это. Теперь это имеет смысл. У меня есть BOOL, который изменяется, когда tableView загружается. Поэтому, когда это меняется, я соответствующим образом меняю свое скрытое свойство. Огромное спасибо. Можете ли вы опубликовать это как ответ?   -  person Douglas    schedule 13.06.2013
comment
Круто, не стесняйтесь публиковать свой собственный ответ, суммирующий все необходимые изменения.   -  person A-Live    schedule 14.06.2013


Ответы (5)


myButton принадлежит ячейке. Вам нужно будет получить экземпляр этого UITableViewCell, а затем вы можете отобразить его, это предполагает, что вы хотите изменить объекты ячейки за пределами cellForRowAtIndexPsth или willDisplayCell.

person LJ Wilson    schedule 12.06.2013
comment
Как бы я это сделал. Я попытался получить экземпляр ButtonCell, но это не сработало в методе, который я вызываю reloadData. - person Douglas; 12.06.2013
comment
Вы должны знать indexPath строки, которую хотите обновить, тогда это просто вопрос чего-то вроде этого: ButtonCell *buttonCell = [self.myTableView cellForRowAtIndexPath:nowIndex]; - person LJ Wilson; 12.06.2013
comment
Благодарю. Я попробую это сегодня вечером и дам вам знать, как это происходит. - person Douglas; 13.06.2013
comment
размер моего табличного представления меняется, поэтому я никогда не знаю, сколько строк у меня получится. Однако ячейка Button всегда последняя. Так что я смог заменить ваш nowIndex моей последней ячейкой. Однако я получаю сообщение об ошибке несовместимых типов указателей, инициализирующих «ButtonCell _strong» с выражением типа «UITableViewCell». Любые идеи? Большое спасибо за Вашу помощь. - person Douglas; 13.06.2013

Сделайте свойство общедоступным.

@property (nonatomic, retain) UIButton *myButton;

Затем в ячейкеForRowAtIndexpath

ButtonCell *buttonCell =(ButtonCell *) [tableView dequeueReusableCellWithIdentifier:@"ButtonCell"];
person Lithu T.V    schedule 12.06.2013
comment
Я думаю, что я уже сделал это. Посмотрите мой файл .h для класса ButtonCell. И я поместил вашу вторую строку в свой метод cellForRowAtIndexPath. - person Douglas; 12.06.2013
comment
@ Дуглас, ты включил (ButtonCell *) в типизацию? - person Lithu T.V; 13.06.2013
comment
., Да, я сделал, хотя я не уверен на 100%, зачем это делать! Позже опубликую еще немного кода, чтобы показать. Еще раз спасибо за все ваше время. - person Douglas; 13.06.2013

В вашем коде

[ButtonCell.myButton setHidden:NO];

Вы пытаетесь использовать имя класса объекта вместо имени объекта. Вам нужно получить ячейку, содержащую вашу кнопку

buttonCell = [tableView cellForRowAtIndexPath:indexPath];
buttonCell.myButton.hidden = NO;
person bbarnhart    schedule 12.06.2013
comment
Спасибо за ваше время. Ячейка с моей кнопкой всегда является последней ячейкой. Я понял, как получить эту последнюю ячейку, но не уверен, как использовать cellForRowAtIndexPath. Я последовал предложению ЭлДжея, но это не сработало, пожалуйста, посмотрите. Любые идеи были бы хорошы. - person Douglas; 13.06.2013
comment
На самом деле ячейка является последней ячейкой в ​​разделе 3. - person Douglas; 13.06.2013

Может ошибка в верхнем регистре?

[buttonCell.myButton setHidden:NO]; // Trying to access instance variable

Вместо :

[ButtonCell.myButton setHidden:NO]; // Trying to access class variable
person DCMaxxx    schedule 12.06.2013
comment
Я не могу использовать нижний регистр buttonCell. Это было создано в cellForRowAtIndexPath, и я хочу скрыть кнопку другим методом. - person Douglas; 12.06.2013

У вас есть общедоступный метод доступа к этому свойству в заголовочном файле ButtonCell? Что-то вроде @property (nonatomic, retain) UIButton *myButton;
Вот как я обычно вижу такое предупреждение компилятора.

person Lenrocexe    schedule 12.06.2013
comment
Проверьте ответ Литу ТВ. Что вы пропустили, так это приведение к ButtonCell. Ваш экземпляр myButton будет просто рассматриваться как обычный UITableViewCell без этого приведения. Должен прокомментировать свой собственный ответ, потому что у меня еще недостаточно представителей. - person Lenrocexe; 12.06.2013