Xcode

Xcode 14.3 編譯缺少 libarclite_macosx.a

前幾天將 Xcode 升級至 14.3 時,我的 CBReader 竟然無法順利編譯,出現如下錯誤。

 

File not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_macosx.a

 

image

 

重要度:
文章分類:
電腦標籤:

Mac App 使用多個 Storyboard 設計畫面

Mac App 在使用 Storyboard 設計畫面時,預設是有一個主要的 Storyboard,裡面可以放置很多個 View,然而畫面一多,處理起來也是麻煩,本文是介紹如何使用多個 Storyboard,以及如何將原有的 Storyboard 分割。

 

測試程式

 

底下是示範操作。

 

首先,先做出第一個視窗。

 

image

 

接著,依傳統的方式,加入 View Controller 當做第二個視窗。

 

image

 

加入後,並在第一視窗的按鈕連上第二視窗,用來開啟第二視窗。

 

image

 

測試執行,果然可以順利開啟第二視窗。


 

image

 

重要度:
文章分類:
電腦標籤:

在 Mac 命令列使用 Github 的 Token 執行 Git Push

以前有寫過一篇「在 Xcode 操作 Git」,為什麼又要寫這篇在命令列的 push 呢?

因為今天用 Xcode v13.3 提交雖然有成功,但推送卻失敗,得到如下訊息。

 

image

 

在 stackoverflow 有看到有人也是今天提問,但還沒有看到回答。

 

https://stackoverflow.com/questions/71581440/q-an-unknown-error-occurred-user-rejected-certificate-for-github-com-17-on

 

所以決定先在命令列推送。

 

重要度:
文章分類:
電腦標籤:

Xcode 單元測試 (Unit Test 和 UI Test)

單元測試也是寫程式重要的一環,雖然我之前寫程式也沒有完全做到,但基本上的測試總是要有的,所以還是了解了一下 Xcode 上的單元測試。

我的環境是 macOS Catalina 10.15 + Xcode 11.1

建置專案

首先,在建立專案是要記得勾選「Include Unit Tests」和「Include UI Tests」。

image

如果一開始沒有加,也可以在主選單用 File -> New -> File... 加上去。

image

建好的專案就會像下圖一般,有 Unit Tests 和 UI Tests 二個區塊。

image

重要度:
文章分類:

Mac Cocoa NSOutlineView 資料綁定

此篇實作是接續「NSOutlineView 使用程式呈現樹狀資料」,那次是用程式來處理,本篇要使用 Cocoa Binding 的方式來綁定資料。

關於 Cocoa Binding,可先參考這篇「Mac Cocoa 資料綁定 (Binding) 實作測試」的基本概念。

簡單來說,就是利用資料綁定的方法來呈現樹狀目錄,而不是寫一堆程式來處理。

準備資料

為了配合綁定的需求,把上一個例子的資料稍為修改如下,主要是加上 class 要加上 @objcMembers,變數要加上 @objc 和 dynamic。

底下就是全部的程式了。

重要度:
文章分類:

NSOutlineView 使用程式呈現樹狀資料

前言

在 Mac AppKit 中,樹狀圖元件是使用 NSOutlineView,這個又被翻譯成「大綱視圖」。

官方文件在此:

https://developer.apple.com/documentation/appkit/NSOutlineView

簡單來說,這個文件大概只比天書簡單一點,真不知誰能看的懂?沒有範例大概是最大的問題,整個 Mac 的說明檔似乎都沒有範例(有啦,上次看 WebView 有一個),而一些有範例的文件,不是時效有點久,就是用 Object-C 寫的,實在很難參考。

翻了許多文件,剛好看到這一篇有人提出 NSOutlineView 的問題,其中一位解答的內容很豐富,有圖有程式,我就試著把程式複製起來,竟然順利執行成功,於是我逐一研究追蹤它的程式,再對照天書一般的說明文件,搭配 Google 翻譯服用,終於又有了初步的成果了。

一些心得

這陣子的研究,對 Mac 程式中的代理 (delegate) 有一點點感覺了。以前用 C++ Builder 處理樹狀目錄時,想法其實很直覺,就是先用程式把每一個項目產生並設定,然後把它們依順序串好,最後把這串交給樹狀目錄主元件,然後再呈現,就完成了。

NSOutlineView 處理的方法不同,它有四個主要的資料處理和代理程式,我們要依它的規則去實作,最後才會產生結果。

我想這大概是以前看過某篇提到的感想,Windows 的作法是把程式、資料、元件等混在一起,不是良好的 MVC 模式,而 Mac 的分離就比較清楚。資料歸資料、處理程式歸程式,畫面由代理程式處理。

底下一一實作並說明。

重要度:
文章分類:

Mac Cocoa 綁定 (Binding) 實作測試

前言

會研究綁定,主要是因為在研究 NSOutlineView (樹狀圖) 時,得知資料有二種處理方法,一種是由程式處理,一種是設定綁定,因為綁定的部份看不懂,所以才先研究簡單的綁定功能。

在網路上找到了這篇文章,看起來寫的蠻清楚的,例子也簡單好懂,不過實作時,偏偏無法運作,花了一晚找不到原因,也查不到相關資料,最後總算在某一篇問答中找到一句話,突破了盲點,才完成初步的綁定測試。

我的環境是:

macOS 10.15 Catalina

Xcode 11.1

Swift 5

也許之前的版本就沒有問題,這點我無法確定,底下一一說明操作經過。

基本設定

我就抄襲該篇的實作,先設計一個 Person 類別,繼承 NSObject,類別中有一個 scroe 屬性。並在 ViewController 中宣告 son 物件。

我原本以為是不是 scroe 不能宣告變數的類型?後來我有指定是 Int 也沒有問題,是我多慮了。

重要度:
文章分類:

WKWebView 功能測試 (下) - 與 Javascript 交流

使用 Javascript 連結網頁與 APP

最後要測試的是最重要的功能,也就是使用 Javascript 連結網頁與 APP。

希望達到的功能有二種:

  • 由 APP 向網頁注入 Javascript,並取得傳回資料。

  • 網頁的 Javascript 執行 APP 的功能並傳資料給 APP。

有了這雙方溝通的功能,就可以做出很多應用了。

由 APP 向網頁注入 Javascript

在這裡我們要設計二個測試:

1. 把 APP 輸入欄位的內容寫到網頁中的 Label 中。

重要度:
文章分類:

WKWebView 功能測試 (上) - 建置、設定、呈現

 

以前 Mac 程式內建的瀏覽器元件是用 WebView,iOS 則是用 UIWebView,而現在最新的是用 WKWebView,不過文中若提到 WebView 通常就是指 WKWebView,除非有特別強調是指舊版的框架。

建置 WKWebView

因為直接使用 WebView 元件似乎會有問題,在 Xcode 上雖然可以執行,但是直接由 APP 執行就看不到 WebView,所以採用使用 code 來建置 WebView。

底下的 code 是 copy 來的,黑色是原來就有的,紅色是後來加上去的。

 

import Cocoa

import WebKit

 

class ViewController: NSViewController, WKUIDelegate, WKNavigationDelegate {

 

    let webView = WKWebView()

    

    override func viewDidLoad() {

        super.viewDidLoad()

 

        // Do any additional setup after loading the view.

        

        self.webView.uiDelegate = self

        self.webView.navigationDelegate = self

        webView.frame = CGRect(x:0,y:0,width:400,height: 270)

        view.addSubview(webView)

                

        let myURL=URL(string: "https://www.apple.com")

        let myRequest = URLRequest(url: myURL!)

        webView.load(myRequest)

    }

 

    override var representedObject: Any? {

        didSet {

        // Update the view, if already loaded.

        }

    }

}

 

重要度:
文章分類:

Cocoa 用程式操控視窗 (下)

 

本篇要實作二個視窗,一個主視窗,一個子視窗,類似在 MS Window 開發程式時的 fmMain、fmOption 二個視窗。

重點在於主視窗可以開啟子視窗,子視窗可以關閉,但並不是像 Mac 的視窗那樣真的關閉,只是隱藏起來。當再次開啟副視窗時,則再次呈現,畫面中的內容也保持一樣。

同時也希望各視窗之間可以彼此操控對方的元件。

 

初步構想

 

  1. 先設定全域變數 vcMain 和 vcOption 來記錄二個視窗的 ViewController。

  2. 要開啟子視窗時,先判斷子視窗是否已經實作了?若無,則實作它,若已實作了則顯示它。

  3. 實作視窗後,記錄在全域變數中。

  4. 子視窗關閉時,採用隱藏方式。

  5. 利用全域變數去控制對方視窗的元件。

 

重要度:
文章分類:

頁面

借我放一下廣告
訂閱 Xcode