Могу ли я сохранить пользовательский объект внутри кнопки в Objective-C? - PullRequest
2 голосов
/ 01 февраля 2010

В winforms / C # большинство всех элементов управления пользовательского интерфейса имеют тег .Tag, например myButton.Tag = myObject; где свойство Tag является типом объекта, так что вы можете в основном хранить любой тип объекта. Как я могу сделать это в Objective-C / Какао? все элементы пользовательского интерфейса имеют что-то вроде .Tag, где я могу хранить NSObject или что-то? Если да, можете ли вы привести пример. Большое спасибо!

Примечание: я видел целое число .Tag там, но я хотел тег объекта. Но я думаю, что этого не существует. хорошо.

Ответы [ 5 ]

5 голосов
/ 01 февраля 2010

Как сказал Георг, вы можете связать любой объект с другим объектом, используя среду выполнения Objective C, так что вы можете связать объект с элементом управления, если вы действительно хотите.

Но это не совсем то, как работает стандартная программа Какао. Вместо этого в Какао шаблон Модель-Представление-Контроллер и Делегирование являются стандартной идиомой, и связывать объект непосредственно с виджетом или представлением не рекомендуется. Даже для очень маленькой программы вы, по крайней мере, создали бы Model-Controller (обычно называемый делегатом приложения на жаргоне Какао), который управляет данными и поддерживает представление, составленное из стандартных элементов управления, как есть. Затем представление и модель-контроллер взаимодействуют через цель / действие и делегирование.

Apple очень хорошо обсуждает шаблоны проектирования, распространенные в Какао, см. здесь .

Как правило, при переходе от одного API (Winforms / C #) к другому API (Какао / Objective-C) есть некоторые сходства, но также и некоторые различия. Обычно стоит узнать, как все делается в этом API, вместо того, чтобы пытаться втиснуть то, к чему вы привыкли, в новую ситуацию. (Просто чтобы прояснить, я не говорю, какой API по своей сути лучше; это обсуждение идет в обе стороны!)

Итак, когда вы находитесь в ситуации:

Чтобы сделать X в API A, я знаю, что идиома P работает. Теперь я хочу сделать X в API B. Как я могу напрямую реализовать идиому P в API B?

Рекомендую спросить

Чтобы сделать X в API B, что мне делать? Какая идиома в API B?

вместо.

2 голосов
/ 01 февраля 2010

NSControl имеет тег и связанный метод setTag: . Он не используется внутри, так что вы можете хранить в нем все, что захотите - он хранит только значения NSInteger.

Все элементы управления Какао наследуются от NSControl.

1 голос
/ 26 февраля 2013

Да. Вы можете добавить свое собственное свойство ко всем UIControls, если хотите. Просто добавьте следующее в ваш код.

#import <objc/runtime.h>

/* -------- The Following Code adds an objectData property for every UIControl ----------- */
@interface UIControl (UIControlAdditions)
@property (nonatomic, retain) id objectData;
@end

static char const * const ObjectDataKey = "MyObjectDataKey";

@implementation UIControl (UIControlAdditions)
@dynamic objectData;
-(id)objectData {
    return objc_getAssociatedObject(self,ObjectDataKey);
}
- (void)setObjectData:(id)newObjectData {
    objc_setAssociatedObject(self, ObjectDataKey, newObjectData, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
/* -------- The Above Code adds an objectData property for every UIControl ----------- */

Кредиты Оле Бегеманну: http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/

1 голос
/ 01 февраля 2010

CALayer имеют возможность хранить произвольные ключи как часть своего механизма кодирования значения ключа. Пример:

CALayer *myLayer = [button layer];
// Storing a value
[layer setValue:@"World!" forKey:@"hello"];
// Retrieving a value
NSLog(@"Hello %@", [layer valueForKey:@"hello"]);

При этом хранение объектов в элементах пользовательского интерфейса нарушает принцип паттерна Model-View-Controller; Я бы посоветовал против этого - подкласс UIView или UIControl, вероятно, был бы более подходящим.

1 голос
/ 01 февраля 2010

Существует возможность добавления тега, если я правильно помню, это целое число.

Это говорит о том, что я почти уверен, что эта функция никогда не нужна в Какао, потому что она просто не работает таким образом.

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

...