【问题标题】:UISplitViewControllerDelegate never calledUISplitViewController Delegate 从未调用过
【发布时间】:2017-06-13 04:59:21
【问题描述】:

我几天来一直在尝试让UISplitViewController 给代表打电话。我尝试在MasterViewController 中设置它,我尝试在DetailViewController 中设置它,我尝试将SVC 作为另一个视图控制器内的容器中的嵌入式视图控制器,并使用prepareForSegue 调用来设置代表。我尝试从 AppDelegate 中的 Storyboard 实例化它并将委托设置在那里。代表永远不会被调用。我要疯了。 我在 iOS 10.3.1 上使用最新的非测试版 Swift (3.1)。

我已使用调试器检查委托实际上是否已设置,并保留在内存中,但是从未调用过方法。

感谢您为我提供的任何帮助。

这是我目前的 AppDelegate,但正如我所说,我已经尝试了 无数 种方法:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    Realm.Configuration.defaultConfiguration.deleteRealmIfMigrationNeeded = true
    if let svc = self.window?.rootViewController as? UISplitViewController {
        svc.delegate = svc.viewControllers.last as! UISplitViewControllerDelegate
    }
    return true
}

编辑 1:

你们中的一些人不明白我要实现的委托。为了澄清,我试图控制UISplitViewController 的代表,换句话说,UISplitViewControllerDelegate。我试图这样做的原因是能够控制视图的折叠。在UISplitViewController 的默认配置中,在iPhone 纵向模式下,它默认为detailViewController。对于大多数应用程序(和我的)来说,这种行为显然是错误的。我打算首先显示列出我要显示的内容的masterViewController,并仅在选择项目时触发detailViewController

我也会接受一个答案,它给了我一些替代方式来实现这种行为(除非我的 detailViewController 设置了内容,否则我更喜欢肖像上的 masterViewController

我知道您可以通过不在情节提要中设置detailViewController 并在选择项目时使用showDetail segue 来获得所描述的行为,但我的问题是我不能在没有默认视图时使用项目已被选中,导致在 iPad 或 iPhone Plus 上横向显示灰色方块(不是很漂亮)。

【问题讨论】:

  • 你最终找到解决方案了吗?

标签: ios iphone swift uikit uisplitviewcontroller


【解决方案1】:

请尝试下面的代码,它对我有用。

在 AppDelegate 中:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let splitViewController = self.window!.rootViewController as! UISplitViewController
    let navViewController = splitViewController.viewControllers.first as? UINavigationController
    let masterVC = navViewController?.topViewController as? MasterViewController
    let detailViewController = splitViewController.viewControllers.last as? DetailsViewController
    masterVC?.delegate = detailViewController

    return true
}

在主视图控制器中

protocol MasterViewControllerDelegate : class{
    func passingData(strName : String)
}

class MasterViewController: UITableViewController {

       weak var delegate : MasterViewControllerDelegate?

       override func viewDidLoad() {
          super.viewDidLoad()

          //Calling Delegate

          delegate?.passingData(strName: "Any Message")

          if let detailViewController = self.delegate as? DetailsViewController {

  splitViewController?.showDetailViewController(detailViewController, sender: nil)
          }
       }
}

在DetailViewController中

class DetailsViewController: UIViewController, MasterViewControllerDelegate{

    //Other IBOutlet and Methods

    //Delegate method of MasterViewControllerDelegate
    func passingData(strName : String)
         print(strName) //OUTPUT: "Any Message"
    }
}

我希望它也对你有用。

【讨论】:

  • 不幸的是,您的回答对我没有用。如您所见,我正在尝试实现 UISplitviewControllerDelegate,正如您的回答所暗示的那样,我将数据传递给详细视图控制器没有问题。
  • 对不起兄弟!我使用的是自定义协议而不是 UISplitviewControllerDelegate
猜你喜欢
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 2012-08-22
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多