2012-05-01 23 views
25

Tôi có cùng một vấn đề như đã giải thích trong câu hỏi này:subclassing UIWindow khi sử dụng storyboards

Where can I change the window my app uses from UIWindow to my own subclass "MyWindow" with storyboard?

Câu hỏi của tôi là làm thế nào để thực hiện phương thức getter một 'cửa sổ' trong đại biểu ứng dụng của tôi mà trả về lớp con 'MyWindow' ? Hoặc có thể có những cách khác để gán phân lớp của tôi vào cửa sổ chính của ứng dụng của tôi?

Trả lời

73

UIWindow trong một dự án Storyboard có thể được subclassed như được giải thích trong UIApplicationDelegate tài liệu tham khảo của Apple:

cửa sổ
Khi một kịch bản đang được sử dụng, ứng dụng phải xuất trình kịch bản bằng cách thêm vào một cửa sổ và đặt cửa sổ đó trên màn hình. Ứng dụng truy vấn thuộc tính này cho cửa sổ. Tài liệu này được giữ lại tham chiếu đến cửa sổ này là cần thiết để giữ cho cửa sổ không được phát hành. Nếu giá trị của thuộc tính là nil (mặc định là ), ứng dụng sẽ tạo một phiên bản chung của UIWindow và gán cho thuộc tính này để đại biểu tham chiếu. Bạn có thể triển khai phương thức getter của giao thức này để cung cấp ứng dụng với một cửa sổ khác.

Nói cách khác trong việc thực hiện AppDelegate bạn chỉ cần thêm các getter sau

Objective-C

- (MyCustomWindow *)window 
{  
    static MyCustomWindow *customWindow = nil; 
    if (!customWindow) customWindow = [[MyCustomWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    return customWindow; 
} 

Swift

var customWindow: MyCustomWindow?  
var window: UIWindow? { 
    get { 
     customWindow = customWindow ?? MyCustomWindow(frame: UIScreen.mainScreen().bounds) 
     return customWindow 
    } 
    set { } 
} 
+0

Bạn có thể vui lòng cung cấp cách tôi có thể ghi đè getter trong Swift không? –

+1

Tôi đã cập nhật câu trả lời với mã Swift –

+0

Cảm ơn rất nhiều .. Nó đã hoạt động. Tôi không tạo ra setter cho điều đó để tôi gặp lỗi. –

1

Trong các ứng dụng của riêng tôi, tôi đã nhìn thấy thuộc tính "window" được khai báo trong AppDelegate.h khi tạo ứng dụng mới từ các mẫu Xcode.

Bạn có thể sửa đổi thuộc tính đó để thay đổi từ "UIWindow" thành "MyWindow" tại thời điểm đó.

Hoặc, một giải pháp ít thanh lịch hơn, bạn có thể chỉ cần bỏ một kiểu đối tượng "MyWindow" khi truy cập.

+1

Cả những sẽ gây ra một 'MyWindow' để tạo ra đỡ phải thao tác chỉ nhầm đúc một' UIWindow' đã tồn tại đến một 'MyWindow '. –

+0

@NoahWitherspoon - vfxdomain có thể đã biết cách tạo một MyWindow (kể từ khi anh ta nhắc đến [câu hỏi liên quan này] (http://stackoverflow.com/questions/7883886/where-can-i-change-the-window-my -app-use-from-uiwindow-to-my-own-subclass-mywi) trong bài đăng của anh ấy ở đó). Câu hỏi của anh ta là anh ta tự hỏi làm sao để MyWindow trở lại bằng phương thức getter của thuộc tính "window". –

+0

@Michael Dautermann - vâng, đó là điều tôi đang hỏi ...Thay đổi UIWindow thành myWindow trong App Delegate sẽ không hoạt động như Noah Witherspoon chỉ ra. – izaslavs

0

của nó không khó khăn như vậy bạn' đang đi lớp đầu tiên UIWindow

class WinCustom : UIWindow{ 
.... 
} 

sau đó trong appdelegate:

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

    self.window = WinCustom(frame: UIScreen.main.bounds) 

    self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() 

    return true 
}