Ios 在不使用故事板的情况下是否可以执行segue?

Ios 在不使用故事板的情况下是否可以执行segue?,ios,swift,xcode,storyboard,segue,Ios,Swift,Xcode,Storyboard,Segue,到目前为止,我一直在以完全编程的方式创建Swift项目。我已经创建了详细的导航控制器和表视图控制器,但没有触摸情节提要(SB)。我想将数据从TableViewCell单击传递到另一个ViewController,但是,我认为我需要使用segue并在SB内部创建/识别它。由于此应用程序随着时间的推移变得非常复杂,因此很难模拟SB内部的所有视图控制器,并且在SB内部创建任何更改都不会反映模拟器上视图内部的任何更改(我已将SB内部的视图与其各自的类配对,但没有任何效果。当标识符匹配时,甚至连序列都无法

到目前为止,我一直在以完全编程的方式创建Swift项目。我已经创建了详细的导航控制器和表视图控制器,但没有触摸情节提要(SB)。我想将数据从TableViewCell单击传递到另一个ViewController,但是,我认为我需要使用segue并在SB内部创建/识别它。由于此应用程序随着时间的推移变得非常复杂,因此很难模拟SB内部的所有视图控制器,并且在SB内部创建任何更改都不会反映模拟器上视图内部的任何更改(我已将SB内部的视图与其各自的类配对,但没有任何效果。当标识符匹配时,甚至连序列都无法识别)。因此,我有几个问题

  • 是否有可能以编程方式执行segue?换句话说,是否有可能在不接触故事板的情况下将数据从一个视图控制器传递到另一个视图控制器

  • 有没有一个简单的指南或技巧可以用来在情节提要中模仿他们的代码?对于一个简单的应用程序,这应该不会太难。但是,如果有人完全以编程的方式创建了应用程序,有没有其他方法可以在情节提要中描述它

  • Interface Builder(IB)只是一个用于编程开发的GUI。在IB中可以做的任何事情都可以通过编程来完成,但并不是所有可以通过编程来完成的事情都可以在IB中完成,因为IB只是用于接口构建和一些接口构建,而不是全部

    segue
    只是IB术语。在iOS中,只能以三种方式显示视图控制器:
    push
    (通过
    UINavigationController
    )、
    present
    (通过演示对象供应商
    UIViewControllerTransitioningDelegate
    )或
    show
    (显示视图控制器的更通用方法)

    由于您是编程式iOS开发(最好的一种,IMO)的新手,请快速入门:

    class ProgrammaticViewController: UIViewController {
    
        override func loadView() {
    
            // do not call super.loadView()
            // most IB developers don't even know this method exists
            //   because this is where IB does its work
            // add all of your view objects here (scroll views,
            //   table views, buttons, everything)
    
            setView()
            addTableView()
            ...
    
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // do call super.viewDidLoad(), however
            // do your post-view setup here, like adding observers
            //   or fetching data
            // this method is called after the entire view
            //   has been loaded into memory so consider that
    
        }
    
        // other lifecycle events that come after viewDidLoad where you
        //   can perform last-second work include viewDidLayoutSubviews(),
        //   viewWillAppear(), viewDidAppear(), etc.
    
        deinit {
            // do any cleanup here like deactivating timers, removing
            //   observers, etc.
        }
    
        // MARK: Methods
    
        func setView() {
    
            // if you're creating your view controller programmatically,
            //   you must create the view controller's actual view property
            //   and it must be done before adding any subviews to the
            //   view controller's view
    
            view = UIView()
            view.frame = UIScreen.main.bounds
            view.backgroundColor = UIColor.white
    
        }
    
    }
    
    如果您正在使用自动布局(您可能应该这样做),您不必总是使用
    view.frame=UIScreen.main.bounds显式设置视图的框架。如果它是应用程序的根视图控制器,则不需要它。窗口拥有该视图控制器,它将设置框架。如果您在根视图中放置了
    UINavigationController
    ,并且您使用的是自动布局,则不需要f您要推送的视图控制器也需要设置其帧。因此,您需要使用类似
    view.frame=UIScreen.main.bounds
    的方式显式设置视图帧的唯一实时操作是以模态方式呈现视图控制器。这是因为模态呈现的视图控制器不属于窗口或naviga它暂时存在于临时容器视图中。在这种情况下,您必须设置其框架

    以编程方式向前传递数据比IB开发人员更简单。只需实例化一个视图控制器,将其一个(非私有)属性注入一个值,然后推送、呈现或显示它。以下是
    didSelectRowAt
    UITableView
    委托的外观:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
        let p = indexPath.row
        let detailViewController = SomeDetailViewController()
    
        detailViewController.someProperty = searchResults[p]
        navigationController?.pushViewController(detailViewController, animated: true)
    
    }
    
    这显然是可行的,因为您已经在视图控制器中创建了该属性,而没有给它一个私有访问修饰符

    class SomeDetailViewController: UIViewController {
    
        var dataObject: SomeType? // injectable
        private var notInjectable: SomeType?
    
    }
    
    更新:就苹果而言,IB显然不是iOS发展的未来,因为引入了SwiftUI,这是以编程方式开发iOS的另一种方式。就个人而言,我讨厌GUI编程,我很高兴看到它慢慢地被淘汰

    是否可以通过编程方式执行一个序列

    当然。有可以用来创建segue的初始值设定项,它有一个
    perform()
    方法,您可以调用该方法来让segue完成它的任务。但是segue主要是一种工具,它可以使故事板中的场景之间更容易转换,因此如果您一开始不使用故事板,就没有理由要这样做

    换句话说,是否可以在不接触故事板的情况下将数据从一个视图控制器传递到另一个视图控制器

    再说一遍,是的。故事板在iOS 5之前根本不存在,你可以打赌人们早在那之前就在编写视图控制器之间转换的应用程序了。你已经得到了关于如何实现这一点的答案。不过,更一般地说,视图控制器只是对象,一个人向另一个人发送信息所需要的只是一个有效的引用指向目标控制器的引用

    但是,如果有人完全以编程方式创建应用程序,是否还有其他方法可以在情节提要中描述该应用程序

    如果您的意思是希望切换到使用故事板,那么是的,有一些好的方法可以做到这一点。如果您的意思是希望以某种方式表示应用程序在故事板中以编程方式执行的操作,但继续以编程方式执行所有操作,那么不,没有办法做到这一点(这样做也没有意义)


    转换到情节提要不一定是一种全有或全无的事情。您可以在情节提要中只对一个视图控制器建模,并根据需要使用
    init(名称:bundle:)
    (初始化情节提要本身)和
    实例化视图控制器(带标识符:)
    (加载特定视图控制器),然后以与现在相同的方式使用该视图控制器。然后可以删除用于设置该视图控制器及其视图层次结构的所有代码,因为您现在是从情节提要加载它。一旦工作正常,请对其他视图控制器重复此过程,展开情节提要并根据需要删除设置代码必要。

    查看。它可能会给您一些提示。感谢@vadian和@iabuseservers的帮助。