#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 вряд ли надежен