我发现这个问题应该对我有所帮助,但是那里的解决方案对我不起作用,而且我不确定某些事情是否发生了变化,或者问题是否与我的代码有关.
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零?我知道我强行打开它,但我不明白为什么在明确指定之后它永远是零.
我刚刚开始使用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) 我有一个UISearchController,配置为搜索非常大的数据.因此,当我在搜索栏中输入时,实际输入我的搜索需要很长时间.它与搜索字段中的每个字符条目执行搜索比较,这非常慢.
我想知道如何解决这个问题.我的想法是:
我想使用方法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) 我在界面构建器中添加了一个搜索栏和搜索显示控制器到我的应用程序.我无法正确地进行deinit(dealloc).
它显示以下行为(swift2,ios9):
如果我在导航控制器中选择"返回"而不是选择项目,则会出现相同的行为.
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) 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) 重新措辞的问题 当iOS更新时,依赖CocoaPods会为长期应用程序健康带来风险吗?可以采取哪些措施来限制风险?
原始问题 我刚刚开始使用带有swift的cocoapods来导入令人印象深刻的库,如EVCloudKitDao和YapDatabase.这些吊舱使我的生活变得更轻松NOW.
我想知道从设计的角度来看,依靠pods是不是一个坏主意.我不确定我将来有什么可能会停止工作并完全搞砸我的应用程序......我从来没有更新过pod来保持工作正常,而且我不确定它有多危险未来的稳定性.其中一些(大多数)是用objective-c编写的,如果有所不同,我在Swift编程.
在项目中使用CocoaPods是一个安全的想法吗?直到现在我一直远离他们,但其中一些是如此可怕......
我有一个使用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) 我试图使用单例来管理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 ×8
ios ×4
nsurl ×2
watchkit ×2
apple-watch ×1
cloudkit ×1
cocoapods ×1
crashlytics ×1
objective-c ×1
optional ×1
retain ×1
sms ×1
uitableview ×1
watchos-2 ×1
wcsession ×1