Как правильно переключаться между контроллерами представления

#ios #swift

#iOS #swift

Вопрос:

Я столкнулся с этой проблемой при попытке в objective-c, а теперь и в Swift. Я создаю контроллер представления (vc1), встраиваю его в навигационный контроллер, а затем, наконец, создаю новый контроллер представления (vc2). Затем я нажимаю кнопку на vc1 и перетаскиваю ее в vc2. Я запускаю приложение, и все в порядке, нажатие на кнопку помещает новый контроллер представления в стек, а нажатие кнопки «Назад» возвращает меня обратно. Однако, как только я перейду к добавлению новых кнопок и текстовых полей в vc2, приложение завершит работу, как только я нажму свою исходную кнопку на vc1, указав первую строку файла делегата приложения в качестве точки останова. Я пробовал много вещей, а именно пытался закодировать переход, используя метод self.performSegueWithIdentifier, но он не работает. Я использую Xcode 6.

storyboard.swift (файл для vc1):

 import UIKit

class storyboard: UIViewController {

    @IBOutlet var titleLabel : UILabel
    @IBOutlet var orLabel : UILabel

    @IBAction func weightedAverageButtonPressed(sender : AnyObject) {

        self.performSegueWithIdentifier("weightedAverage1", sender: self)
    }

    @IBAction func whatINeedButtonPressed(sender : AnyObject) {
    }
}
 

weightedAverage.swift (vc2) (я все прокомментировал, чтобы избавиться от сбоя, но безуспешно):

 import UIKit

class weightedAverage: UIViewController {

 /*   @IBOutlet var weightAverageTitleLabel : UILabel
    @IBOutlet var percentagetoCalcLabel : UILabel
    @IBOutlet var percentageLabel : UILabel
    @IBOutlet var percentageInput : UITextField

    @IBAction func continueButton(sender : AnyObject)
    {

     //var percent = percentageInput.text

    // percentageLabel.text = percent

    }*/

}
 

appdelegate.swift:

 import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {

        return true
    }
}
 

Вот что говорит вывод отладки (когда я прокомментировал свой метод IBAction):

2014-06-19 12:29:12.471 gradeCalc[13217:580024] -[_ttc9gradecalc10 storyboard weightedAverageButtonPressed:]: нераспознанный селектор, отправленный экземпляру 0x10bb0ad30 (lldb)

Он также выделяет строку делегирования приложения, начинающуюся с «class AppDelegate ….»

Когда я раскомментирую метод, который содержит метод performSegue …, во ВСЕМ выходном журнале указывается «(lldb)», и он по-прежнему выделяет строку делегата приложения

Комментарии:

1. итак …. у вас есть вызываемый контроллер представления storyboard ?

2. да, начальный контроллер представления называется раскадровкой

3. Чтобы отладить сбой, установите точку останова исключения , смотрите, как это сделать здесь: developer.apple.com/library/ios/recipes /…

4. Как только вы это сделаете, вы можете вставить исключение в свой вопрос, и мы сможем вам лучше помочь.

5. ^ Я отредактировал сообщение, чтобы включить отладочный вывод, спасибо

Ответ №1:

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

Редактировать: весь код в моем рабочем примере для двух контроллеров представления

Первый контроллер представления:

 class OneViewController: UIViewController {


@IBOutlet var label1: UILabel

@IBOutlet var label2: UILabel

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}
 

Второй контроллер представления:

 class TwoViewController: UIViewController {
@IBOutlet var upperlabel: UILabel
@IBOutlet var lowerlabel: UILabel
@IBOutlet var textbox: UITextField
@IBAction func button(sender: AnyObject) {
    var percent = textbox.text
    lowerlabel.text = percent
}
override func viewDidLoad() {
    super.viewDidLoad()
    }
 

Не удается добавить изображение из-за NDA, но раскадровка — это просто NavigationController> VC1> VC2, с двумя метками в каждом VC, текстовым полем в VC2 и кнопкой в каждом. Только вторая кнопка имеет действие в своем классе VC.

Комментарии:

1. Является ли идентификатор Segue именем: weightedAverage1 в раскадровке?

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

3. Итак, я воссоздал ваш проект и получил ту же ошибку, настроив его по-своему. Я не знаю почему, но выполнение этого в таком порядке не привело к ошибкам: создайте оба вида и контроллер навигации, затем добавьте все кнопки и метки, затем подключите кнопку на vc1 для перехода к vc2 (на раскадровке, без кода), затем измените класс каждого представления на свой собственный, затемдобавьте выходы для меток / текстовых полей. Поэтому я бы посоветовал попробовать переделать представления, сначала добавить элементы и убедиться, что они выполняются, подключить их, убедиться, что они выполняются, и делать это шаг за шагом

4. предполагая, что это работает, должен ли я создавать каждое отдельное представление, которое я хотел бы видеть в своем приложении, прежде чем подключать их все?

5. Вы могли бы попробовать просто сбросить класс по умолчанию для двух представлений в раскадровке, а затем переделать кнопку для переключения между ними. Позже вы все равно сможете добавлять к представлениям, и, надеюсь, это не повлияет на все, что вы создаете. Однако Xcode 6 вряд ли надежен