2015-01-16 8 views
3

Здесь вы можете увидеть, что я поставил делегат моей подклассы TextView себе:Как ссылаться на родительский контроллер представления подкласса?

import Foundation 
class ImageCaptionTextView: UITextView, UITextViewDelegate { 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     delegate = self 
    } 

Теперь в моем контроллере мои методы делегата не работают. Я использую все методы делегата ImageCaptionTextView в подклассе ImageCaptionTextView вместо того, где они были ранее, который был классом контроллеров.

Теперь есть некоторый код, который мне нужно добавить к связанному с контроллером методу делегата textViewDidEndEditing для ImageCaptionTextView, но поскольку метод делегата для ImageCaptionTextView установлен внутри подкласса ImageCaptionTextView, этот новый код, добавленный в контроллер, не будет работать.

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

Так что мой вопрос:

Как я могу ссылаться на родительский контроллер в ImageCaptionTextView, с тем вместо того, чтобы делегировать ImageCaptionTextView к себе я могу установить его на контроллер?

Спасибо за ваше время.

ответ

1

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

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

+0

Так было в конце. – LondonGuy

0

Я никогда раньше не использовал swift, но если он работает как Objective-C, то способ сделать это - установить свойство делегирования подкласса UITextView в его родительский контроллер представления в момент его создания. т.е.

В родителе VC (простите меня, если это в Obj-C):

ImageCaptionTextView *myTextView = [ImageCaptionTextView new]; 
myTextView.delegate = self; 

Если это не имеет никакого смысла в стриже, то я буду просто удалить этот ответ. Но я надеюсь, что это поможет!

+1

Я просто думал об этом. Так или иначе, делегат настроен на контроллер, когда textView инициализируется. Я попытался подключиться к интерфейсу построителя из textView в контроллер. Протестировано, и это не сработало. – LondonGuy

+0

Mmh. Не уверен, что я могу помочь вам там, так как я тоже не знаком с IB. Просто программный, весь путь (должен действительно разветвляться когда-нибудь ...). В любом случае, если бы я был вами, я бы разместил это редактирование в вашем вопросе (включая снимки экрана вашего IB-соединения), он вернет его поверх очереди, и, возможно, кто-то с опытом IB/swift сможет помочь). –

1

Я думаю, что это может помочь вам ..

Прежде всего, необходимо определить переменную делегата в вашем UITextView. Это возможный способ установить его:

class ImageCaptionTextView: UITextView, UITextViewDelegate { 

    var delegate: UITextViewDelegate! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // delegate = self 
    } 
} 

Восклицательный знак означает, что переменная еще не инициализирован во время декларации, но что он будет последним в коде. Таким образом, он не является необязательным и ДОЛЖЕН быть инициализирован где-то.

Затем в вашем UIViewController вы инициализируете эту переменную ссылкой со своим UITextView. Выход в раскадровку должен сделать трюк. Если вы настроили UIView программно, это еще проще.

IBOutlet путь:

@IBOutlet weak var imageCaptionTextView: UITextView! 

// later in the code 

imageCaptionTextView.delegate = self 

Programatically:

let imageCaptionTextView = ImageCaptionTextView() 
imageCaptionTextView.delegate = self 

Вы должны быть хорошими, то;)

+0

Отмечено, потому что это сработало, но я пошел с другим ответом и сохранил все в контроллере. – LondonGuy

+0

Рад, что это помогает :) – Tokuriku

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