2013-12-05 3 views
-1

Глядя на это изображение, вы можете увидеть, что UIView загружается из кончика пера имеет «Владелец файла»Использование NSSet/allTargets для получения xib так называемого «владельца файла»?

enter image description here

Обратите внимание на XIb, Apple назвала что-то «Владелец Файла».

Итак, откройте Xcode, откройте любой XIB, посмотрите на заполнители и смотреть прямо внизу, чтобы увидеть:

"Владелец файла".

В этом конкретном примере «владелец xib-файла» является классом LoginScreen.

Таким образом, во время выполнения для конкретной вещи, созданной этим XIb, то «был-XIB-файл-владелец» (чеканить фразу) будет фактически:

Это будет: некоторые конкретный экземпляр класса LoginScreen.

Теперь во время выполнения. Очевидно, что в UIView, с каждым UIButton, вы можете просто позвонить

[self.someButton sendActionsForControlEvents:UIControlEventTouchUpInside ]; 

, и вы получите действительно «перейти к», именно:

Вы идете: что экземпляр класса LoginScreen.

{Примечание - КУРС, UIButton может быть направлен в любом месте. Я спрашиваю о том случае, когда мы знаем, на самом деле UIButton действительно указывающего на «был-XIB-файл-владелец» UIButton.}

В самом деле, метод allTargets действительно возвратит эту цель (в этом случае некоторые экземпляра класса LoginScreen) как часть мишени (S N) он возвращается, и в самом деле селектор (ов), и т.д. и т.п.

Я не достаточно хорошо, чтобы написать код для allTargets , NSSet и т. Д.

Может ли кто-нибудь показать мне, как извлечь, используя allTargets и некоторый компьютерный код, экземпляр класса LoginScr een? т.е. исполняемый экземпляр «has-xib-file-owner», видимый в xib? Приветствия.


Позже:

причудливо, ответ на этот вопрос, по существу, и, как правило:

[self.allTargets anyObject]

так, если он создан из XIb там только будет быть единственным, и это именно то, что описано выше. Повторить: КУРСЫ, UIButton можно было указывать В ЛЮБОЕ ВРЕМЯ. Я спрашиваю о случае, когда мы знаем для факта, что UIButton действительно указывает на «has-xib-file-owner» UIButton.

В этом («нормальном») случае ответ действительно просто удивительно прост - [self.allTargets anyObject].

+0

Зачем вам нужен владелец кнопки? – giorashc

+0

Вы имеете в виду владельца или контейнер? –

+0

есть N целей и 1 супервизор ... 0 владельцев –

ответ

1

Нет владельца файла (как видно из IB), который известен во время выполнения. Информация о владельце файла отсутствует. Ближайшее вы можете сделать, это проверить класс цели:

if([self respondsToSelector:@selector(allTargets)]) { 
     NSSet *owners = self.allTargets; 
        for(id owner in owners) { 
         if([owner isKindOfClass:[UIViewController class]]) 
          NSLog(@"owner: %@", owner); 
        } 
      } 

или просто считать мишенью является владельцем

if([self respondsToSelector:@selector(allTargets)]) { 
     id owner = [self.allTargets anyObject]; 
     NSLog(@"owner: %@", owner); 
    } 
+0

еще раз: нет владельца, поскольку Anoop в своем ответе сказал: « Владелец файла ничего а прокси, который занимает класс во время выполнения ». –

+0

нет нет владельца файла во время выполнения ... этой информации нет. –

+0

нет. он знает только, что у него НЕКОТОРЫЙ идентификатор в качестве цели –

1

На самом деле нет «владельца» для кнопки.

UIButton - это подвид определенного вида, в IB, вы перетаскиваете свою кнопку в определенном виде, а затем кнопка становится подпунктом этого вида. Чтобы получить представление о кнопке, вы вызываете [myButton superview];

Тогда на Button можно ссылаться как свойство или iVar определенного класса, но это что-то еще.

+0

Нет, я имею в виду перетаскивание кнопки из библиотеки в представление. Когда вы говорите «владелец», вы ссылаетесь на владельца файла, отображаемого в IB? Таким образом, это обычно VC, или это также может быть точкой зрения. С помощью NSSet вы можете получить доступ к одному случайному объекту с помощью метода anyObject, но я не уверен, что это то, что вы ищете. –

+0

@JoeBlow нет такого владельца –

+0

+1 ответ в порядке –

1

У вас есть UIButton, и это цель прилагается для определенных контрольных событий (обычно UIControlEventTouchUpInside).

Вы можете получить целевые задачи в UIButton следующим

NSSet *targets = [myButton allTargets]; 

for(NSObject *target in targets) 
{ 
    //Do something with target 

    //Maybe it's a view: 
    if([target isKindOfClass:[UIView class]]) 
    { 
     //Do something to view specific target 
    } 
} 

Важно отметить две вещи:

Цели не являются на «хозяев» в UIButton, они не нужны быть UIViews (если я правильно понимаю ваш вопрос). Целями могут быть любой объект, как правило, они будут получены от NSObject.

«Владелец файла» в Interface Builder это просто термин для UIViewController (как правило), который «владеет» перо - это может или не может быть объектом кнопки!

Если вы знаете, что ваша кнопка имеет вашего файла владельца в качестве цели, то вы можете проверить на него следующим образом (хотя я бы не рекомендовал кодирования, как это):

//Assuming your File Owner is "LoginScreen" as in your picture 
NSSet *targets = [myButton allTargets]; 

for(NSObject *target in targets) 
{ 
    //Is the target our File Owner class type? 
    if([target isKindOfClass:[LoginScreen class]]) 
    { 
     LoginScreen *login = (LoginScreen *)target 

     //Do something with `login` 
    } 
} 

Лучше способом было бы рекурсивно проверить nextResponder вашего UIButton, пока вы не нажмете на свой контроллер управления просмотром. Я не тестировал следующий код, но он следует документации:

UIResponder *responder = [myButton nextResponder]; 

while([responder isKindOfClass:[UIViewController class]] == NO && 
     responder != nil) 
{ 
    responder = [responder nextResponder]; 
} 

//If your button is "owned" in the responder chain 
// by a UIViewController, then `responder` will be it 
// otherwise `responder` will be nil 
if(responder) 
{ 
    //Do something 
} 

Я не знаю, зачем вам это нужно. Возможно, есть более простое решение вашей проблемы?

+0

Симеон, в вашем примере кода два, строка 7: ** isKindOfClass: [LoginScreen class] ** У меня есть две загадки: (A) вы предполагаете, что программист знает, что это класс LoginScreen; нет ли более общего решения? (т. е. я спрашиваю «для UIButton, как определить, что класс принадлежит FileOwner на xib ...»). И (B), который может соответствовать «любому» экземпляру LoginScreen (я верю?), Я хочу найти фактический LoginScreen (скорее всего UIViewController), который действительно является FileOwner этого xib. Есть предположения?! :) – Fattie

+1

Более общее решение может заключаться в проверке 'isKindOfClass: [UIViewController class]', так как это может найти любой контроллер вида, прикрепленный к кнопке в качестве цели. Последняя часть моего решения (используя 'nextResponder') найдет ближайший контроллер« родителя »вашей кнопки, который может быть или не быть прикреплен как цель. – simeon

+0

Возможно, лучший ответ заключается в том, что, если вы, программист, знаете, что UIButton - это общий тип UIButton, где действительно ** все ** цели действительно являются экземпляром-файла-FileOwnerClass: тогда просто возьмите первый пункт в строке 9 кода Симеона (неважно, какой из них) .. и действительно, это ответ. (Тот факт, что цели действительно были созданы путем загрузки xib и использования «FileOwner» {, который понимается/известен xib-загрузчику), полностью неизвестен самому UIView/UIButton.) В элементе управления есть флаг NO, oh, эта цель была загружена из xib/FileOwner ». – Fattie

Смежные вопросы