小编Cha*_*lie的帖子

带预设机身的WatchKit短信

我发现这个问题应该对我有所帮助,但是那里的解决方案对我不起作用,而且我不确定某些事情是否发生了变化,或者问题是否与我的代码有关.

let messageBody = "hello"
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
print("URLSAFEBODY: \(urlSafeBody)")
WKExtension.sharedExtension().openSystemURL(NSURL(string: "sms:&body=\(urlSafeBody)")!)
Run Code Online (Sandbox Code Playgroud)

执行此代码时,我收到的消息是,urlSafeBody在nil时强制解包可选,导致崩溃.为什么是urlSafeBody零?我知道我强行打开它,但我不明白为什么在明确指定之后它永远是零.

sms nsurl optional swift watchkit

17
推荐指数
1
解决办法
319
查看次数

CloudKit - 具有依赖性的CKQueryOperation

我刚刚开始使用CloudKit,所以请耐心等待.

背景信息

在WWDC 2015上,苹果发表了关于CloudKit的演讲https://developer.apple.com/videos/wwdc/2015/?id=715

在这次演讲中,他们警告不要创建链接查询,而是推荐这种策略:

let firstFetch = CKFetchRecordsOperation(...)
let secondFetch = CKFetchRecordsOperation(...)
...
secondFetch.addDependency(firstFetch)

letQueue = NSOperationQueue()
queue.addOperations([firstFetch, secondFetch], waitUntilFinished: false)
Run Code Online (Sandbox Code Playgroud)

示例结构

测试项目数据库包含宠物及其所有者,它看起来像这样:

|Pets               |   |Owners     |
|-name              |   |-firstName |
|-birthdate         |   |-lastName  |
|-owner (Reference) |   |           |
Run Code Online (Sandbox Code Playgroud)

我的问题

我试图找到属于所有者的所有宠物,我担心我正在创建链苹果警告.请参阅下面的两种方法,它们可以做同样的事情,但有两种方法.哪个更正确或者都错了?我觉得我在做同样的事情,但只是使用完成块.

我很困惑如何更改otherSearchBtnClick:使用依赖项.我需要在哪里添加

ownerQueryOp.addDependency(queryOp)
Run Code Online (Sandbox Code Playgroud)

在otherSearchBtnClick:?

@IBAction func searchBtnClick(sender: AnyObject) {
    var petString = ""
    let container = CKContainer.defaultContainer()
    let publicDatabase = container.publicCloudDatabase
    let privateDatabase = container.privateCloudDatabase

    let predicate = NSPredicate(format: "lastName == '\(ownerLastNameTxt.text)'")
    let ckQuery = CKQuery(recordType: …
Run Code Online (Sandbox Code Playgroud)

ios swift cloudkit

6
推荐指数
1
解决办法
1444
查看次数

UISearchController仅在搜索按钮单击时更新

我有一个UISearchController,配置为搜索非常大的数据.因此,当我在搜索栏中输入时,实际输入我的搜索需要很长时间.它与搜索字段中的每个字符条目执行搜索比较,这非常慢.

我想知道如何解决这个问题.我的想法是:

  1. 只有在用户完成输入后才能执行搜索并点击搜索按钮
  2. 在后台线程上执行搜索,释放主线程以进行键盘输入

我想使用方法1, 但我似乎无法弄清楚如何使用新的UISearchController执行此操作.

以下是我的相关项目代码:

class AirportSearchTBVC: UITableViewController, UISearchResultsUpdating{
var airportData = [Dictionary<String, String>]()
var filteredData = [Dictionary<String, String>]()
var searchController = UISearchController()
override func viewDidLoad() {
    super.viewDidLoad()


    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self

    searchController.dimsBackgroundDuringPresentation = false

    searchController.searchBar.sizeToFit()
    tableView.tableHeaderView = searchController.searchBar

    definesPresentationContext = true


    searchController.hidesNavigationBarDuringPresentation = false

    self.tableView.reloadData()
}

func updateSearchResultsForSearchController(searchController: UISearchController) {

    filteredData = []

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[cd] %@", searchController.searchBar.text!)
    let array = (airportData as NSArray).filteredArrayUsingPredicate(searchPredicate)

    filteredData = array as! [Dictionary<String, String>]

    self.tableView.reloadData() …
Run Code Online (Sandbox Code Playgroud)

ios swift uisearchcontroller

6
推荐指数
2
解决办法
7135
查看次数

带有SearchController的TableView - 未调用DEINIT

我在界面构建器中添加了一个搜索栏和搜索显示控制器到我的应用程序.我无法正确地进行deinit(dealloc).

它显示以下行为(swift2,ios9):

  • 用户不搜索任何内容,只需从tableView中选择一个项目,调用DEINIT即可
  • 用户搜索某些内容(或只搜索搜索栏中的内容),取消搜索,从tableView中选择项目,调用DEINIT
  • 用户搜索某些东西(或只是点击搜索栏),然后从tableView中选择一个项目,不调用DEINIT :(

如果我在导航控制器中选择"返回"而不是选择项目,则会出现相同的行为.

code removed - refer to COMPLETE CODE at bottom of post.
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏!

更新进一步测试表明,从视图控制器中删除progressHud/loadingHud完全没有影响DEINIT没有被调用.它必须与tableview或searchcontroller本身有关...

更新2我尝试在viewWillDissapear中调用searchBarCancelButtonClicked()方法,但仍然没有释放.即使你点击"取消"然后导航它就会......

更新3将willDisappear/didDisappear更改为以下对DEINIT没有影响 - 但不会给出错误的界面问题(感谢Polina).我试图找出我能发布的任何东西,但到目前为止还没有运气.

    override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(true)
    searchBarCancelButtonClicked(searchController.searchBar)
}

override func viewDidDisappear(animated: Bool) {
    print("View did disappear")
    searchController.searchBar.resignFirstResponder()
    searchController.searchBar.endEditing(true)
    searchController.active = false
    loadingHud.removeFromSuperview()
    progressHud.removeFromSuperview()
    searchController.searchBar.delegate = nil
    searchController.searchResultsUpdater = nil
    searchController = nil
    tableView = nil

    super.viewDidDisappear(true)

}
Run Code Online (Sandbox Code Playgroud)

更新4我找不到答案.真的希望有人可以帮忙!

更新5响应@ConfusedByCode - 我更新了以下方法,以便[unowned self] in在所有闭包或后台线程操作中使用:

code removed - …
Run Code Online (Sandbox Code Playgroud)

uitableview retain ios swift uisearchcontroller

6
推荐指数
2
解决办法
2023
查看次数

AppleWatch Messages URL可以硬编码,但不能使用变量

TLDR当我将电话号码硬编码到URL中时,它会正确地在监视消息中打开,但是当我使用变量字符串时,其中输入的数字完全相同,但事实并非如此.

例:

 NSURL(string: "sms:/open?addresses=8888888888,9999999999,3333333333&body=Test")
Run Code Online (Sandbox Code Playgroud)

上面的代码有效但下面的代码没有:

 let hardCode = "8888888888,9999999999,3333333333"
 NSURL(string: "sms:/open?addresses=\(hardCode)&body=Test")
Run Code Online (Sandbox Code Playgroud)

详细信息: 我正在使用变量创建一个URL,以便在预装内容的Apple Watch上打开消息.我从联系簿中获取电话号码并将其存储在阵列中.它们以这种格式提供:

(###)### - ####但需要##########

我通过将电话号码硬编码到URL中来测试代码,并且它适用于所有联系人和已完成的正文:

if let urlSafeBody = urlSafeBody, url = NSURL(string: "sms:/open?addresses=8888888888,9999999999,3333333333&body=\(urlSafeBody)") {
        print("FINAL URL: \(url)")
        WKExtension.sharedExtension().openSystemURL(url)
    }
Run Code Online (Sandbox Code Playgroud)

但是,当我以编程方式构建电话号码值时,它不起作用:

//holds phone numbers without special chars
    var tempArray: [String] = []

    //if I can access the unformatted numbers
    if let recips = saveData["recips"] as? [String] {
        //for each number provided
        recips.forEach { (person: String) in
            //remove all non-numerical digits
            //person is now (###) ###-####
            let …
Run Code Online (Sandbox Code Playgroud)

nsurl swift apple-watch

6
推荐指数
1
解决办法
212
查看次数

CocoaPods和Swift - 安全可靠吗?

重新措辞的问题 当iOS更新时,依赖CocoaPods会为长期应用程序健康带来风险吗?可以采取哪些措施来限制风险?

原始问题 我刚刚开始使用带有swift的cocoapods来导入令人印象深刻的库,如EVCloudKitDao和YapDatabase.这些吊舱使我的生活变得更轻松NOW.

我想知道从设计的角度来看,依靠pods是不是一个坏主意.我不确定我将来有什么可能会停止工作并完全搞砸我的应用程序......我从来没有更新过pod来保持工作正常,而且我不确定它有多危险未来的稳定性.其中一些(大多数)是用objective-c编写的,如果有所不同,我在Swift编程.

在项目中使用CocoaPods是一个安全的想法吗?直到现在我一直远离他们,但其中一些是如此可怕......

objective-c ios cocoapods swift

4
推荐指数
1
解决办法
980
查看次数

答案由Crashlytics - 添加自定义事件

我有一个使用Crashlytics with Answers的应用程序.两者都正常工作,我看到框架中内置的事件被跟踪.

我试图通过在我的View Controller中使用以下代码行添加自定义事件:

Answers.logCustomEventWithName("Flight Complete", customAttributes: nil)
Run Code Online (Sandbox Code Playgroud)

我的问题是编译器无法识别Answers对象.它只是告诉我"使用未解析的标识符"答案""这是有道理的,因为我从来没有声明它.

我不确定在何处或如何创建此Answers对象,因为它已经集成并适用于默认事件.有谁知道我应该在应用程序中声明它在哪里使用?(AppDelegate?)或声明是什么样的?他们没有在文档中显示它.

谢谢

更新:这是我尝试添加到AppDelegate,但仍然没有识别"答案"对象...

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Fabric.with([Crashlytics.self, Answers.self])
Run Code Online (Sandbox Code Playgroud)

crashlytics swift twitter-fabric

4
推荐指数
1
解决办法
1589
查看次数

watchOS WCSession'配对'和'watchAppAvailable'不可用

我试图使用单例来管理WCSession消息,我在这里找到.

我明白它想要做什么,但我不明白为什么我会收到错误...这是我正在努力的路线:

if let session = session where session.paired && session.watchAppInstalled {
Run Code Online (Sandbox Code Playgroud)

错误:'watchAppInstalled'不可用

错误:'配对'不可靠

问题:如何提供这些属性?一般来说是watchOS和ios的新手.谢谢!

整个代码:

import WatchConnectivity

class WatchSessionManager: NSObject, WCSessionDelegate {

    static let sharedManager = WatchSessionManager()
    private override init() {
        super.init()
    }

    private let session: WCSession? = WCSession.isSupported() ? WCSession.defaultSession() : nil

    private var validSession: WCSession? {

        // paired - the user has to have their device paired to the watch
        // watchAppInstalled - the user must have your watch app installed

        // Note: …
Run Code Online (Sandbox Code Playgroud)

swift watchkit watchos-2 wcsession

2
推荐指数
1
解决办法
1721
查看次数