Người ủy quyền ứng dụng phải triển khai thuộc tính window nếu muốn sử dụng nhanh chóng tệp bảng phân cảnh chính


82

Tôi vừa phát triển một ứng dụng, nhưng khi chạy trong trình mô phỏng, bảng điều khiển trình gỡ lỗi cho biết:

Người ủy quyền ứng dụng phải triển khai thuộc tính window nếu muốn sử dụng tệp bảng phân cảnh chính.

Tôi có một tệp đại biểu ứng dụng. Thông báo có nghĩa là gì và làm cách nào để ứng dụng của tôi hoạt động?


Câu hỏi đó rất khó hiểu. Bạn có thể cố gắng cải thiện nó không?
clearlight

Không chắc bạn đang cố gắng làm gì. Nhưng từ những gì bạn cung cấp, tôi có thể hỏi: bạn đã có thuộc var window: UIWindow?tính trong lớp AppDelegate của mình chưa?
lchamp

Đây là thông báo lỗi rằng Xcode spits ra trong giao diện điều khiển
brainray

Kiểm tra lớp appDelegate của bạn, Nó phải là lớp con của UIResponder. Nếu người ủy quyền ứng dụng của bạn là lớp con của Ứng dụng UIA. Vui lòng kiểm tra lại một lần nữa.
Aashish1aug

Câu trả lời:


158

Đảm bảo rằng bạn có khai báo thuộc tính sau trong lớp AppDelegate của mình:

var window: UIWindow?

9
Làm thế nào mà chỉ cần khai báo một tài sản đã giải quyết được vấn đề! Các nhà phát triển quả thực rất điên rồ.
Sazzad Hissain Khan

109

Nếu bạn chạy dự án của mình trên iOS 13.0, trong trường hợp đó, bạn sẽ phải đối mặt với sự cố. Vì iOS 13 trở lên, ứng dụng khởi chạy khác với các phiên bản trước đó.

  • Trong iOS 13 trở lên, sử dụng UISceneDelegatecác đối tượng để phản hồi các sự kiện trong vòng đời trong một ứng dụng dựa trên cảnh

  • Trong iOS 12 trở về trước, hãy sử dụng UIApplicationDelegateđối tượng để phản hồi các sự kiện trong vòng đời.

Khi bạn khởi chạy ứng dụng trong iOS 12 trở về trước thì UIApplicationMainlớp sẽ mong đợi một thuộc tính cửa sổ trong AppDelegatelớp của bạn như SceneDelegateđã có. Vì vậy, vấn đề của bạn sẽ được giải quyết nếu bạn thêm dòng sau vào AppDelegatelớp của bạn .

var window: UIWindow?

Đối với Objective-C

@property (strong, nonatomic) UIWindow *window;

Bạn có thể tìm thêm ở đây Vòng đời của ứng dụng .


1
Tôi viết dòng này trong lớp appdelegate và tôi đã thay đổi giao diện chính (Target -> General -> Main Interface = Main.storyboard Tuy nhiên tôi đang nhận được cùng một phiên bản .Xcode được 11,0 .Làm thế nào để sửa chữa nó.
Madhu_Nani

Bạn có thể vui lòng chia sẻ nhật ký tình yêu của bạn?
iMuzahid

tập tin đầu vào 'CustomTabBar.swift' đã được sửa đổi trong thời gian xây dựng chỉ huy CompileSwiftSources thất bại với một mã thoát khác không
Madhu_Nani

Nhưng nhật ký của bạn cho biết bạn đã sửa đổi mã khi xây dựng dự án của mình. Làm sạch thư mục xây dựng của bạn (Command + Shif + K). Hy vọng sự cố của bạn sẽ được khôi phục.
iMuzahid

Vâng nó được thực hiện ..May được Xcode 11 là một số chậm trong .Thanks thiết bị
Madhu_Nani

29

Đề phòng trường hợp bất kỳ ai gặp lại điều này và đang lập trình trong Objective-C, hãy đảm bảo rằng bạn có dòng mã này trong AppDelegate.htệp của mình :

@property (strong, nonatomic) UIWindow *window;

22

Tôi đã nhận được lỗi này, khi tôi tạo dự án mới trong XCode 11. Tôi chưa sử dụng SwiftUI. Đây là các bước, tôi đã xem xét để khắc phục điều này.

  1. Đã xóa Application Scene Manifestmục nhập khỏiInfo.plist
  2. xóa SceneDelegate.swifttập tin
  3. Đã xóa tất cả các phương thức liên quan đến cảnh trong AppDelegate.swiftlớp
  4. thêm var window: UIWindow?tài sản trong AppDelegate.swiftlớp

Sau các bước này, tôi có thể chạy ứng dụng trên phiên bản trước iOS 13.

[EDIT]
Cuối cùng, AppDelegate.swifttệp của bạn sẽ trông giống như sau.

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

}

2
Nếu bạn không sử dụng swiftUI, đây sẽ là câu trả lời chính xác phù hợp với tôi. Cảm ơn @Sarvan
Abhijith Brumal

6

Tôi đã gặp vấn đề tương tự, chỉ cần thêm var window: UIWindow?vào khi lỗi gỡ lỗi cho biết.

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

2

Bạn có thể kiểm tra lớp đại biểu ứng dụng của mình:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    // MARK: UISceneSession Lifecycle

    @available(iOS 13.0, *)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    @available(iOS 13.0, *)
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }
}

2

Swift 5 & Xcode 11

Đảm bảo rằng SceneDelegatecó chứa UIWindowtài sản

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    //...
}

Đủ công bằng - ngoại trừ của tôi làm và vẫn có lỗi. Tôi sẽ ủng hộ vì nó ít nhất có thể áp dụng được.
StephenBoesch

0

Đã trả lời từ lâu, nhưng để giúp hiểu các câu hỏi ở trên về lý do tại sao chỉ cần thêm thuộc tính window lại giải quyết được vấn đề, hãy lưu ý rằng app ủy quyền tuân theo UIApplicationDelegategiao thức xác định thuộc tính @property (nullable, nonatomic, strong) UIWindow *window;mà các lớp cần cung cấp để chỉ định window to use when presenting a storyboard. Việc không cung cấp gây ra cảnh báo nhật ký Xcode.


0

Thêm khai báo cửa sổ sau vào tệp Appdelegate

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window:UIWindow?
    ...

Việc triển khai thuộc tính này là bắt buộc nếu tệp Info.plist của ứng dụng của bạn chứa khóa UIMainStoryboardFile. Giá trị mặc định của thuộc tính tổng hợp này là nil, khiến ứng dụng tạo một đối tượng UIWindow chung và gán nó cho thuộc tính. Nếu bạn muốn cung cấp cửa sổ tùy chỉnh cho ứng dụng của mình, bạn phải triển khai phương thức getter của thuộc tính này và sử dụng nó để tạo và trả lại cửa sổ tùy chỉnh của mình.


0

Cài đặt trong Tệp kê khai cảnh ứng dụng Info.plist> Bật Mutliple Windows> false. Điều này giải quyết các vấn đề đối với tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.