Получить пользовательские данные на основе нажатия кнопки (iOS)? - PullRequest
1 голос
/ 13 февраля 2011

Я прошу прощения, если это простой вопрос, но я не смог найти достаточного решения, и я немного схожу с ума: P

У меня есть приложение с несколькими кнопками(40-50) для различных представлений, и должен быть построен словарь с количеством записей, основанных на том, какая кнопка была нажата.

(Например, если бы кнопка 27 была нажата, я бы построил Dict вviewController с: Имя -> Адрес Джона Смита -> 1 Infinite Loop Age -> 99)

Очевидно, что писать действие, специфичное для каждой кнопки, неправильно.

Что я хотел бы сделать, так этодля создания подкласса UIButton (продолжая с приведенным выше примером), добавив Name, Address и Age в качестве переменных экземпляра к моей пользовательской кнопке, и для установки каждой из этих переменных экземпляра, когда создается кнопка с помощью init: Затем, когда эта кнопка нажата,У меня может быть SINGLE buildDict: (id) действие отправителя, которое вызывается всеми кнопками, и я просто заполняю словарь sender.Name и т. Д. *

Мой вопрос:я могу добавить поля в инспектор атрибутов в Интерфейсном Разработчике, чтобы установить эти значения?Если это невозможно, где я могу найти экземпляр кнопки, чтобы я мог установить эти значения программно?

Ответы [ 2 ]

6 голосов
/ 13 февраля 2011

вы не хотите помещать данные, принадлежащие модели, в представление.И это тоже звучит очень сложно.
Вставить данные в конструктор интерфейсов?Мне повезло, если мне не нужно редактировать теги для моих просмотров, и вы хотите редактировать данные в нем?

Серьезно, сделай это правильно.Создайте NSArray.40 предметов на 40 кнопок.Используйте редактор plist, чтобы создать список адресов и загрузить этот файл plist в ваш код.Это самый быстрый и чистый способ сделать это.

Присвойте каждой кнопке метку.(если вам нужно добавить 40 кнопок, я бы все равно сделал это в коде) и подключил их к IBAction.Я бы посоветовал вам присвоить первому элементу тег 1000. Кнопка без тега ведет себя как кнопка с тегом 0, и вы этого не хотите.И вы не хотите вычитать 1, если вы переходите от кнопки к индексу массива.

- (IBAction)buttonPressed:(UIButton *)sender {
    // remember? tag 1000 equals index 0. 
    NSUInteger index = sender.tag - 1000;
    NSDictionary *object = [self.data objectAtIndex:index];
    // do whatever you want
}

Нет необходимости создавать подклассы.Не нужно нарушать концепцию модель-представление-контроллер.

1 голос
/ 13 февраля 2011

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

Интерфейсный конструктор не позволит вам добавлять дополнительные атрибуты.

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

В Xcode выберите:

Файл-> Новый файл-> Класс Objective C (Подкласс UIView)).

Используйте имя наподобие MyCustomButton.

Затем вам нужно заменить (в .h) :UIView на :UIButton (для этого вы подклассифицируете из UIButton инет полностью из UIView).

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

В результате вы получите что-тоэто выглядит следующим образом:

@interface MyButton : UIButton {
    NSString* name;
    NSString* address;
    NSNumber* age;
}

@property(nonatomic,retain)NSString* name;
@property(nonatomic,retain)NSString* address;
@property(nonatomic,retain)NSNumber* age;

@end

Не забудьте @synthesize свои свойства.

Чтобы сделать пользовательский init, просто напишите свой собственный метод инициализации:

- (id)initWith:(NSString*)aName and:(NSString*)aStreet and:(NSNumber*)anAge{
    self = [super init];
    self.name = aName;
    self.address= aStreet;
    self.age=anAge;

    return sef;
}

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...