Есть ли способ узнать, от чего проснулся мой UIView? - PullRequest
1 голос
/ 04 марта 2011

У меня есть подкласс UIView, который можно инициализировать из множества перьев.Есть ли какой-нибудь способ получить доступ из моего класса UIView, с помощью которого он был инициализирован?

Как вы можете видеть ниже, в настоящее время я устанавливаю тег, а затем могу проверить это значение в своем классе, но мне было просто любопытно, знали ли UIViews о том, к какому кончику они прикреплены, илиесли бы был какой-то способ получить к нему доступ через декодер.Махало, если кто-нибудь знает.

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:viewNibName owner:self options:nil];
self.viewInstance = (ViewClass *)[nibViews objectAtIndex:0];
self.viewInstance.tag = VIEW_INSTANCE_ID;

Ответы [ 3 ]

3 голосов
/ 04 марта 2011

Я не верю, что в настоящее время существует хороший способ для объекта выяснить, с какого конца он загружается. Помните: любой объект, который реализует NSCoding, может храниться в файле nib, а не только в представлениях. Если бы был способ выяснить это, это, вероятно, было бы путем вызова метода в NSKeyedArchiver или NSCoder, и я ничего там не вижу.

Если вы действительно верите, что вам нужна эта возможность, я бы предложил определить протокол с помощью метода, подобного "- (NSString *) nibName", и реализовать его в ваших классах, которые загружают nib. Затем вы можете подключить свой вид к значку прокси-сервера «Владелец файла» в пате, и он может запросить у владельца пера имя пера. UIViewController уже имеет методы -nibName и -nibBundle, поэтому в большинстве случаев это потребует очень мало работы.

Тем не менее, я бы не советовал делать такие вещи. Если у вас есть класс представления, который ведет себя по-разному в зависимости от загружаемого им кончика, я бы воспринял это как сильный сигнал о том, что ваш код должен быть пересмотрен. Я бы либо переместил код, который зависит от имени пера, в класс контроллера, либо разделил бы код на два или более отдельных класса представления.

1 голос
/ 04 марта 2011

Почему бы вам не создать подкласс UIViewController (с его основным видом) вместо UIView напрямую ...? UIViewControllers имеет 2 свойства: «nibName» и «nibBundle», которые могут делать то, что вы просите ...

0 голосов
/ 27 ноября 2014

Это сделает это:

private var nibNameAssociationKey: UInt8 = 0

extension UIView {

    var nibName: String {
        get {
            return objc_getAssociatedObject(self, &nibNameAssociationKey) as String
        }
        set(newValue) {
            objc_setAssociatedObject(self, &nibNameAssociationKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN))
        }
    }

    class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> UIView? {
        var view = UINib(nibName: nibNamed, bundle: bundle).instantiateWithOwner(nil, options: nil)[0] as? UIView
        view?.nibName = nibNamed
        return view
    }
}

Использование:

var someView = SomeView.loadFromNibNamed("SomeSubviewOfSomeView") as SomeView?
...
var myNibName = someView!.nibName // will be "SomeSubviewOfSomeView"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...