Каков ключевой путь в пользовательских атрибутах времени выполнения?

Я унаследовал проект, и я запутался в том, что такое определенный ключ. Мой вопрос в том, что такое стильName key Path? это свойство для представления? Как узнать, какие ключи доступны?

Например, после того, как я выберу UILabel из раскадровки, я проверяю инспектор идентификации и в пользовательских атрибутах времени выполнения вижу следующее:

enter image description here

Я попытался открыть файл main-styles.plist, но не уверен, как он связан.

когда я нажимаю на инспектора атрибутов (при этом все еще сохраняя UILabel в раскадровке) это выглядит так:

enter image description here

Ответ 1

Существует NSKeyValueCoding protocol, который соответствует многим объектам внутри UIKit.

Один из методов в NSKeyValueCoding - valueForKey: (и многие другие соответствующие методы, проверьте связанную документацию).

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

Так, например, на этом ярлыке я мог бы сделать что-то вроде этого:

Objective-C:

NSString *style = [myLabel valueForKey:@"styleName"];

Swift:

let style = myLabel.valueForKey("styleName")

Теперь я могу захватить значение, установленное через Interface Builder и во время выполнения, я могу сделать что-то с меткой, основываясь на том, какое значение было установлено здесь. Например, здесь я мог бы использовать конкретное "имя стиля" для создания ярлыка определенным образом.

Если вы ищете проект для valueForKey или "styleName", вы, скорее всего, найдете, где это свойство используется и что делается с ним точно.


Чтобы узнать о моем вопросе об инспекторе атрибутов, начиная с Xcode 6, мы можем использовать свойство @IBInspectable для создания свойств, которые будут отображаться в Инспекторе атрибутов (as см. здесь). Рассмотрим это расширение UIView:

extension UIView {
    @IBInspectable var borderColor : UIColor? {
        set (newValue) {
            self.layer.borderColor = (newValue ?? UIColor.clearColor()).CGColor
        }
        get {
            return UIColor(CGColor: self.layer.borderColor)
        }
    }
}

Теперь, если мы посмотрим на инспектор атрибутов для любого UIView (или подкласса) в нашей раскадровке, мы увидим следующее:

enter image description here

Теперь у нас есть свойство "Цвет границы", доступное через Инспектор атрибутов, который обычно отсутствует. Причина, по которой я указываю этот инструмент, заключается в том, что всякий раз, когда вы устанавливаете одно из этих свойств через Инспектор атрибутов, вы установили фактически определенное значение в качестве одного из этих "Атрибутов, определяемых пользователем":

enter image description here

И всякий раз, когда это представление загружается из XIB в моем приложении, одна из первых вещей, которые произойдут, заключается в том, что мое свойство borderColor будет установлено на этот красный цвет, который я выбрал в построителе интерфейса.

Ответ 2

Ниже приведен список доступных типов атрибутов и соответствующий тип свойства.

 Boolean – BOOL (true/false)
 Number – NSNumber * or any numeric scalar, e.g. NSInteger
 String – NSString 
 Point – CGPoint
 Size – CGSize
 Rect – CGRect
 Range – NSRange
 Color – UIColor 

Здесь показано изображение Как определить определяемые пользователем атрибуты времени выполнения

Ответ 3

На основе Apple doc

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

Изображение атрибутов времени выполнения

Пользовательское представление получит это сообщение, когда загружается nib:

[customView setValue:[NSNumber numberWithBoolean:NO] forKeyPath:@"isDataLoaded"];
[customView setValue:@"Hatha" forKeyPath:@"excersize.yoga"];
[customView setValue:nil forKeyPath:@"myData"];

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

Потому что эти методы вызывается, когда загружается nib. Таким образом, эти атрибуты времени выполнения могут быть получены внутри -(void)awakeFromNib.

Например,

- (void)awakeFromNib
{
// @property (nonatomic) BOOL isDataLoaded, which is assigned by the above `User Defined Runtime Attributes` picture.
   BOOL isLoaded = self.isDataLoaded; 
}

Ответ 4

спасибо nhgrif. На самом деле, благодаря вашему ответу, который был замечательным, плюс один я нашел, что происходит. Они создали глобальную категорию в UIView. его называют UIView + mystyle. там у них есть метод со следующей сигнатурой:

- (void) setStyleName:(NSString*) styleName

поэтому xcode использует этот метод без "набора" и сопоставляет его с атрибутом пути ключа выполнения. в этом методе они применяют атрибут.