2016-03-02 5 views
0

В моей ViewController я установил:Можно ли выполнить функцию из UIView XIB?

self.view.addSubview(xib) 

где xib является class myView: UIView {

Могу ли я выполнить переход, когда пользователь нажимает на кнопку из тех XIB? Потому что, когда я пытаюсь, он говорит, что

Value of type myView has no member performSegue 

Каков другой способ решить эту проблему?

ответ

1

performSegue является частью UIViewController. UIView не можем выполнить segue. Попробуйте вызвать этот метод из связанного UIViewController

+0

Как это можно назвать? У меня есть 2 разных класса. –

+0

Добавьте переменную 'viewController' в свой класс, который должен выполнить segue. И перед добавлением subview, установите 'viewController' в ваше представление. 'xib.viewController = self; self.view.addSubview (xib); ' – GRiMe2D

+0

Не могли бы вы описать первую часть о' viewController'? –

0

Да, вы можете, вы можете позвонить в сегу, чтобы произойти.

  1. Создайте segue в раскадровке и дайте ей идентификатор.
  2. Когда пользователь нажимает на кнопку, вы можете вызвать переход произойдет, как следующее:

    self.storyboard(performSegueWithIdentifier("identifier", sender: self)) 
    
+0

'Использовать неразрешенный идентификатор 'performSegueWithIdentifier'' –

+0

вместо использования self.storyboard попробуйте создать экземпляр раскадровки и использовать это вместо этого. let storyboard = UIStoryboard (имя: Main, bundle: nil); раскадровка (performSegueWithIdentifier («идентификатор», отправитель: self)) –

+0

'let storyboard = UIStoryboard (имя:« Main », bundle: nil)'. Такая же ошибка –

2

Вы можете достичь с помощью протоколов/делегатов.

В вас UIView класса есть протокол с методом, например: userDidClickButton()

И в своем классе ViewController прослушать вызов делегата обратно. При создании экземпляра класса UIView вас назначить делегата себя, например: uiviewClassInstance.delegate = self

И ваш взгляд класса контроллера осуществлять вышеупомянутый метод делегата и внутри него называют perfromSegue.

Edit: внутри класса UIView

protocol SomeProtocol { 
    // protocol definition goes here 
    func didClickSubmit() 
} 

var delegate:SomeProtocol 



@IBAction func buttonClick(sender: UIButton) { 
    delegate.didClickSubmit() 
    } 

класс Вид контроллера:

public class YourViewController: UIViewController,SomeProtocol 

let signUpView = SignUpView.signUpView() 
singUpView.delegate = self 

func didClickSubmit() { 
    // Perform your segue here 
} 
+0

'let signUpView = SignUpView.signUpView()' у него нет метода делегата –

+0

вы можете написать его в Gist? –

+0

Этот ответ верен, причина, по которой вы получаете метод делегирования делегата, заключается в том, что вы не связали свой класс UIView с вашим UIViewController как с экземпляром, либо вы используете экземпляр как экземпляр instance.delegate = self " – Abhi

1

Я провел часы, пытаясь узнать делегации и хотя я не обернуты мою голову вокруг него полностью. Я знаю, что такое код. Вот шпаргалка о том, как это произошло:

Цель:. Для выполнения функции или передать данные обратно из UIView в UIViewController это в

Пример: У вас есть UIViewController с UIView, вы хотите нажать кнопку в UIView и заставить UIViewController выполнить сеанс.

Отказ от ответственности: этот конкретный пример хромой, поскольку вы можете подключить кнопку UIView прямо к UIViewController через раскадровку, но вы получите представление.

Чтобы выполнить пример выполните следующие действия:

1. В классе UIView вы хотите, чтобы написать это (это отправитель класс):

import UIKit //written for reference on file scope 

// Define protocol outside of class 
protocol SomeUIViewDelegate { 
    func segueFunction() //this function will be in your receiving class 
} 

class SomeUIView: UIView { 

    //define the delegate as such: 
    var delegate: SomeUIViewDelegate? 

    //fake button press function I made for the tutorial 
    func someButtonPress(){ 

     //this code goes wherever you want the delegate to "fire," like in this button press 
     delegate?.segueFunction() 

    } 
} 

2. В вашем классе UIViewController вы захотите это написать (это приемник класс):

import UIKit //written for reference on file scope 

//state the class will conform to the delegate 
class SomeUIViewController: UIViewController, SomeUIViewDelegate { 

    //IMPORTANT: you must instantiate the SomeUIView class! 
    //use storyboard to right click drag and drop a line onto assistant editor, then name the instance 
    @IBOutlet weak var SomeUIViewNamedInstance 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //set the classes delegate to itself in viewDidLoad 
     SomeUIViewNamedInstance.delegate = self 

    } 

    //this is the function we defined in the protocol in SomeUIView class, it executes whenever you call it from the sender class 
    func segueFunction() { 

     //perform segue or whatever else you want 
     //EXTRA CREDIT: You can pass data too from sender to receiver within the function parameters!! 

    } 

} 

EDIT: Хотелось бы добавить эту замечательную статью о делегировании этого ответа для любопытных умов. http://matteomanferdini.com/how-ios-view-controllers-communicate-with-each-other/

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