从未调用过UISplitViewControllerDelegate

时间:2017-06-13 04:59:21

标签: ios iphone swift uikit uisplitviewcontroller

我一直在努力让UISplitViewController给代表打电话。我尝试在MasterViewController中设置它,我尝试在DetailViewController中设置它,我尝试将SVC作为嵌入式视图控制器放在另一个视图控制器内的容器中,然后使用{ {1}}调用以设置委托。我尝试在prepareForSegue的Storyboard中实例化它并在那里设置委托。代表永远不会被召唤。我要疯了。 我在iOS 10.3.1上使用最新的非beta Swift(3.1)。

我已经使用调试器来检查委托实际上已设置,并保留在内存中,但是,这些方法永远不会被调用。

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

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

AppDelegate

编辑1:

有些人不明白我正在尝试实施的代理。为了澄清,我试图控制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 } 的代表,换句话说,UISplitViewController。我试图这样做的原因是能够控制视图的折叠。在UISplitViewControllerDelegate的默认配置中,在纵向模式的iPhone上,默认配置为UISplitViewController。对于大多数应用程序(以及我的)来说,这种行为显然是错我打算首先显示列出我要显示的内容的detailViewController,并仅在选择项目时触发masterViewController

除非我的detailViewController设置了内容,否则我也会接受一个答案,这个答案给了我一些替代方式来表达这种行为(首选的是masterViewController

我知道你可以通过在故事板中设置detailViewController并在选择项目时使用detailViewController segue来获得所描述的行为,但我的问题是我不能拥有未选择任何项目时的默认视图,在iPad或iPhone Plus上横向显示时会显示灰色方块(不是很漂亮)。

1 个答案:

答案 0 :(得分:0)

请尝试以下代码,这对我有用。

在AppDelegate中:

{
   "Success": true,
   "TotalRecords": 2,
   "RoomSearchResult":    [
            {
         "ResourceItemID": 2290,
         "Name": "Room 23 (L02)",
         "LocationId": 7,
         "GroupID": 518,
         "FloorID": 2,
         "DefaultCapacity": 4,
         "CanBeBooked": true
      },
{
         "ResourceItemID": 2063,
         "Name": "Room 15 (L10)",
         "LocationId": 7,
         "GroupID": 518,
         "FloorID": 10,
         "DefaultCapacity": 8,
         "CanBeBooked": true
      }
   ],
   "Error":    {
      "ErrorCode": 0,
      "ErrorDescription": ""
   }
}

在MasterViewController中

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
}

在DetailViewController中

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)
          }
       }
}

我希望它也适合你。