我正在构建一个应用程序(在XCode中),在一般意义上,它向用户显示信息.信息作为单个对象存储在数据库中(恰好是由heroku托管的Parse服务器).用户可以选择"查看"在距当前位置的设定距离内创建的信息.(当保存到数据库时,信息与其lat和long一起保存,具体取决于用户启动保存时的位置).我知道我可以通过将他们的纬度和长度与观察用户的当前lat和long进行比较来过滤这些信息,只显示那些足够接近的信息.粗略/一般:
var currentUserLat = latitude //latitude of user's current location
var infoSet = [Objects] //set of all pulled info from DB
for info in infoSet{
if info.lat-currentUserLat < 3{//arbitrary value
//display the info
}else{
//don't display
}
}
Run Code Online (Sandbox Code Playgroud)
这个设置得足够好,而且运行正常.但它工作正常的原因是因为当前数据库中的条目数量很少(应用程序正处于开发阶段).在实际使用中(即许多用户),DB可能充满了信息对象(比如说,千元).在我看来,单独拉动和比较信息的纬度并将其与当前用户的每个数据库条目的纬度进行比较将花费太长时间.我知道必须有一种方法可以及时地做到这一点(想想更多...他们只显示附近的人的档案,尽管有数百万的档案,他们也不需要那么长的时间)但我不知道什么是最有效的.我想在数据库中为不同的地理区域创建单独的部分,然后根据用户当前位置的位置搜索数据库的那些特定部分,但这似乎并不复杂,但仍会导致大量信息被拉出.做这个的最好方式是什么?
我有一个应用程序,允许用户向每个人发送消息.通过将发送的消息保存在本地SQLite数据库中,同时实际将消息发送到数据库并使用推送通知将消息发送到收件人的SQLite数据库来完成该过程.设置我工作得很好.但是,我感到困惑的是如何为用户设置实际的交互式UI(我正在使用XCode).我认为它应该是UITableView每个表格单元格代表一条消息.但是,通过这种方法,我遇到了一些要求:
变量TextView大小
与常规iOS消息一样,TextView大小需要变量,调整其大小以适合每条消息中的所有文本.我不知道如何做到这一点.我对如何通常改变大小有了一般性的了解,但是根本不知道如何基于该视图中的文本动态地拥有它.
变量TextView位置
同样,与常规iOS消息传递一样,textview需要偏移到右侧或左侧,具体取决于发件人是用户还是正在与之交谈的人.我也不知道该怎么做,因为它改变了textview的中心.
非选择性
Xcode允许按下细胞.处理此选择后可以通过didSelectRowatIndexPathtableView函数实现.我可以简单地实现这一点,但是单击单元格会使其变暗以指示它已被按下.我想消除这一点,同时保留选择一些文本,复制和粘贴或其他任何内容的能力(就像在手机上正常发送消息一样).
其他方法?
这是问题的真正含义.我考虑过上面的方法,因为基于我对XCodeUI元素的有限经验,这就是我能够提出的所有方法.如果有一个更好的方法(甚至可能是一个pod或框架),我很乐意听到它.我不需要消息传递UI看起来很棒,只是干净和清爽.
我正在利用 UserDefaults 来保存偶尔需要写入的小值。我相信我已经正确设置了它,但我不确定为什么在退出模拟器并再次启动它后它不起作用。设置:
let defaults = UserDefaults.standard
Run Code Online (Sandbox Code Playgroud)
然后将其写入/修改如下:
defaults.set(true, forKey: "defaultsChecker")
defaults.synchronize()
Run Code Online (Sandbox Code Playgroud)
使用 print 语句我可以看到该值确实从 nil 更新为 true。viewDidLoad但是,在再次打开模拟器时(退出后)检查 a 中的值,如下所示:
print("The value is is \((defaults.value(forKey: "defaultsChecker") as! Bool)))")
Run Code Online (Sandbox Code Playgroud)
这总是在开始时返回 nil,这意味着它不能通过关闭和重新打开模拟器来保存/保留。不知道为什么会这样。
我目前有一组异步函数,它们都被调用viewDidLoad().在每个函数的末尾是一个bool,在函数完成后从false设置为true.还有一个条件语句检查两个函数的bool,它们触发第三个函数.这个条件语句是两个功能(当我想叫两个两个已完成).通常:
var checkOne = false
var checkTwo = false
func functionOne(){
//async stuff
checkOne = true
if checkOne == true && checkTwo == true{
functionThree()//will only run if both functionOne and functionTwo have been completed
}
}
func functionTwo(){
//async stuff
checkTwo = true
if checkOne == true && checkTwo == true{
functionThree()//will only run if both functionOne and functionTwo have been completed
}
}
func functionThree(){
//stuff
}
override func viewDidLoad() {
functionOne()
functionTwo()
} …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序设置,用户可以登录和注销(这是通过heroku托管的Parse服务器,使用Parse框架处理).
要登录,用户输入凭据,如果服务器验证它们,则segue将它们移动到另一个viewcontroller.注销用户退出应用程序并将其转移回登录屏幕.这些工作正常.
如果初始登录凭据不正确,则会显示警告,提示用户重试并且用户未登录(显然)并保留在登录屏幕上.
但是,如果用户登录,注销,然后输入不正确的凭据(按此顺序,没有关闭模拟器),则会出现问题.错误的凭据会显示提示警报; 点击"确定"关闭警报,用户没有登录,但是视图被锁定到注销屏幕(注销按钮是......这应该只有登录用户才能访问).不存在segue segue(编码或在故事板上),将用户从登录直接移动到注销屏幕.
没有任何操作可行,因为许多操作都需要用户ID,并且没有任何操作因为没有登录.我不知道为什么不正确的登录会以这种方式移动VC,因为不存在可以做到这一点的segue.有一个反向运动(退出时),但没有朝那个方向运动.
有人有什么想法吗?以下是相关的登录代码.
@IBAction func signInTapped(_ sender: UIButton) {
UIApplication.shared.beginIgnoringInteractionEvents()
PFUser.logInWithUsername(inBackground: userNameTextField.text!, password: passwordTextField.text!, block: { (user, error) in
if user != nil{
self.performSegue(withIdentifier: "signInSegue", sender: self)//if the sign in works
} else{
if let errorString = (error! as NSError).userInfo["error"] as? String{
let errorMessage = errorString
self.displayAlert("Failed login", message: errorMessage)//this is the code run when the login fails, yet it somehow can sometimes segue to the other viewcontroller
}
}
})
}
Run Code Online (Sandbox Code Playgroud)
以下是正在进行的分步示意图.
xcode
swift
parse-server
我有一个解析服务器(由heroku 托管),我已将其配置为发送推送通知。它在仪表板上似乎设置正确,但是当我实际发送一个时,它只是说推送已“已保存”,但当我去检查其状态时,它发送失败。这是设置的index.js:
var api = new ParseServer({
databaseURI: databaseUri || 'mongodb://localhost:27017/dev',
cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
appId: process.env.APP_ID || 'myAppId',
masterKey: process.env.MASTER_KEY || '', //Add your master key here. Keep it $
serverURL: process.env.SERVER_URL || 'http://localhost:1337/parse', // Don't$
liveQuery: {
classNames: ["Posts", "Comments"] // List of classes to support for query s$
},
push: JSON.parse(process.env.SERVER_PUSH || "{}"),
});
Run Code Online (Sandbox Code Playgroud)
PARSE_SERVER_PUSH(以及 appId、masterKey 和 serverURL)在 heroku 站点上的我的配置变量上进行配置,如下所示:
{ "ios":
{ "pfx": "/Users/path/to/folder/Prod\Cert.p12 ",
"passphrase": "******",
"bundleId": "com.parse.app",
"production": true
}
} …Run Code Online (Sandbox Code Playgroud) 我想在Excel文档中选择工作表.它们都被命名,但我知道您可以使用其固有数字选择一个工作表(即,即使创建的第二个工作表被命名为"风险等级",我仍然可以通过Sheet2.select选择它).无论如何使用计数器变量设置它?以下是宏的简化和隔离代码行:
counter = 0
Sheet & counter & .Select
counter = counter + 1
Run Code Online (Sandbox Code Playgroud)
有人有主意吗?
我最近将我的应用程序从之前版本的swift转换为swift 3.0(并且还获得了最新版本的Xcode),并且在许多其他错误中,我收到了以下一个:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let installation = PFInstallation.current()
installation.setDeviceTokenFrom(deviceToken)
installation.saveInBackground()
PFPush.subscribeToChannel(inBackground: "") { (succeeded: Bool, error: NSError?) in
if succeeded {
print("ParseStarterProject successfully subscribed to push notifications on the broadcast channel.\n");
} else {
print("ParseStarterProject failed to subscribe to push notifications on the broadcast channel with error = %@.\n", error)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这来自我作为模板下载的SDK(PF指的是Parse框架......我使用的是Heroku托管的Parse服务器).返回错误说:"无法将类型的值'(Bool,NSError?) - >()'转换为预期的参数类型'PFBooleanResultBlock?'"
不知道如何解决这个问题.有人有什么想法吗?
我已经将单元格的公式设置为等于和,但单元格只显示方程式,而不是方程式的结果......该值不会被计算,也不会显示.我可以从单元格中复制公式的内容并将其粘贴到另一个单元格中,该单元格将显示结果,但我需要初始的显示结果.这是代码:
Set SumRangeBegin = Cells(Sumrow, BeginSumColumn)
Set SumRangeEnd = Cells(Sumrow, EndSumColumn)
Set SumRangeTotal = Range(SumRangeBegin, SumRangeEnd)
ActiveCell.Formula = "=SUM(" & SumRangeTotal.Address & ")"
Run Code Online (Sandbox Code Playgroud)
单元格将显示= SUM($ AA $ 854:$ AV $ 854)(由于我将这些变量设置为最初... SumRow和SumColumn),但不会显示结果.不知道为什么会这样.
我有一个应用程序,其中我保存的阵列CNContact,以UserDefaults作为这样的:
var contactsArray = [CNContact]()
let defaults = UserDefaults()
func (contact: CNContact){
contactsArray.append(contact)
let contactArrayArchive = NSKeyedArchiver.archivedData(withRootObject: contactArray) //archive the data
defaults.set(contactArrayArchive, forKey: "contactArray")
defaults.synchronize()
}
Run Code Online (Sandbox Code Playgroud)
这会归档数据以允许将其保存到defaults.我的问题是我怎么能这样的数据转换回阵列CNContact中viewDidLoad.我在网上看到很多答案,建议使用NSKeyedArchiver.unarchiveObjectwithData但是在Xcode中键入这个,swift 3,表示它.unarchiveObjectwithData不是.的成员NSKeyedArchiver.我一直在寻找有关如何在swift 3中执行此操作的内容,但一直未成功.我怎样才能解除价值?