我正在使用 Parse 将数据加载到我的 Today Extension 中,然后更新我的 Widget 文本字段。
当我运行我的代码时似乎没有问题,事实上,为了调试我的扩展中的代码,我将该函数复制到我的主应用程序中并运行它,以便我可以看到输出(我知道它可以调试小部件,但它似乎是一个非常混乱和麻烦的过程)。所有的输出都是正确的,所以当它在我的小部件中不起作用时,我完全傻眼了。
我认为它在我的小部件扩展中不起作用,因为我在小部件视图中获得了"无法加载"文本字段。
我使用的函数叫做"update_widget",我在我的Widget "TodayViewController"中的"super.viewDidLoad()"中调用"update_widget"
我是否以错误的方式更新我的小部件?
关于为什么会这样的任何想法?
"TodayViewController.swift" 的代码如下。假设 Parse ID 和查询 ID 是正确的,而不是 "HiFriends"。假设 Day 类已编写并且工作正常。最后请记住,如果我将 "update_widget" 粘贴到我的主应用程序 "AppDelegate.swift" 中,所有输出都是正确的并且不会发生崩溃。深入研究。
另外,如果它有帮助,我注意到在显示"无法加载"之前,小部件会显示"正在加载",我在"update_widget"函数中查询之前会打印它。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 | // TodayViewController.swift // WidgetExtention // // Created by Vishnu Murale on 6/9/15. // Copyright (c) 2015 Vishnu Murale. All rights reserved. // import UIKit import NotificationCenter import Parse class TodayViewController: UIViewController, NCWidgetProviding { @IBOutlet weak var WidgetText: UILabel! let BlockOrder = ["A","B","C","D","E","F","G"] var Schedule = PFObject(className:"Schedule") let defaults = NSUserDefaults.standardUserDefaults() override func viewDidLoad() { super.viewDidLoad() Parse.setApplicationId("HiFriends", clientKey:"HiFriends") self.update_widget() } func find_Minutes(hour_before : Int, hour_after : Int)->Int{ var num_hours_less = Int(hour_before/100) var num_hours_more = Int(hour_after/100) var diff_hours = num_hours_more-num_hours_less var diff_minutes = hour_after%100 - hour_before%100 return diff_hours*60 + diff_minutes; } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func substring(origin :String, StartIndex : Int, EndIndex : Int)->String{ var counter = 0 var subString ="" for char in origin{ if(StartIndex <= counter && counter < EndIndex){ subString += String(char) } counter++; } return subString } func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)!) { } func update_widget() -> Bool{ var Success = false; var Days = [Day]() var query = PFQuery(className:"Schedule") self.WidgetText.text = "Loading" query.getObjectInBackgroundWithId("HiFriends") { (SchedObj: PFObject?, error: NSError?) -> Void in if error == nil && SchedObj != nil { var Widget_Block = [Array<String>]() var Time_Block = [Array<String>]() Widget_Block.removeAll() Time_Block.removeAll() println("Retrived Information Successful") self.Schedule = SchedObj! print(self.Schedule) var Monday = Day(name:"Monday") var Tuesday = Day(name:"Tuesday") var Wednesday = Day(name:"Wednesday") var Thursday = Day(name:"Thursday") var Friday = Day(name:"Friday") if(self.Schedule["MondayBlock"] != nil && self.Schedule["MondayTime"] != nil){ var bO: Array<String> = self.Schedule["MondayBlock"] as! Array<String> var t: Array<String> = self.Schedule["MondayTime"] as! Array<String> Widget_Block.append(bO) Time_Block.append(t) Monday.refreshDay(bO, times: t) } if(self.Schedule["TuesdayBlock"] != nil && self.Schedule["TuesdayTime"] != nil){ var bO: Array<String> = self.Schedule["TuesdayBlock"] as! Array<String> var t: Array<String> = self.Schedule["TuesdayTime"] as! Array<String> Widget_Block.append(bO) Time_Block.append(t) Tuesday.refreshDay(bO, times: t) } if(self.Schedule["WednesdayBlock"] != nil && self.Schedule["WednesdayTime"] != nil){ var bO: Array<String> = self.Schedule["WednesdayBlock"] as! Array<String> var t: Array<String> = self.Schedule["WednesdayTime"] as! Array<String> Widget_Block.append(bO) Time_Block.append(t) Wednesday.refreshDay(bO, times: t) } if(self.Schedule["ThursdayBlock"] != nil && self.Schedule["ThursdayTime"] != nil){ var bO: Array<String> = self.Schedule["ThursdayBlock"] as! Array<String> var t: Array<String> = self.Schedule["ThursdayTime"] as! Array<String> Widget_Block.append(bO) Time_Block.append(t) Thursday.refreshDay(bO, times: t) } if(self.Schedule["FridayBlock"] != nil && self.Schedule["FridayTime"] != nil){ var bO: Array<String> = self.Schedule["FridayBlock"] as! Array<String> var t: Array<String> = self.Schedule["FridayTime"] as! Array<String> Widget_Block.append(bO) Time_Block.append(t) Friday.refreshDay(bO, times: t) } Days.append(Monday) Days.append(Tuesday) Days.append(Wednesday) Days.append(Thursday) Days.append(Friday) var currentDateTime = Monday.getDate_AsString() var Day_Num = Monday.getDayOfWeek_fromString(currentDateTime) var User_Info = [String]() let defaults = NSUserDefaults.standardUserDefaults() if(defaults.objectForKey("ButtonTexts") != nil){ User_Info = defaults.objectForKey("ButtonTexts") as! Array<String> } var Switch_Info = [Bool]() if(defaults.objectForKey("SwitchValues") != nil){ Switch_Info = defaults.objectForKey("SwitchValues") as! Array<Bool> } println("") println("Finding Widget Date ...") var End_Times = [Int]() if(self.Schedule["EndTimes"] != nil){ End_Times = self.Schedule["EndTimes"] as! Array<Int> } var minutes_until_nextblock = 0; var blockName_Widget ="" if(Day_Num >= 0 && Day_Num <= 4){ for i in reverse(0...Widget_Block[Day_Num].count-1){ var dateAfter = Time_Block[Day_Num][i] var CurrTime = Monday.NSDateToStringWidget(NSDate()) var End_Time_String ="" if(i+1 <= Widget_Block[Day_Num].count-1){ End_Time_String = Time_Block[Day_Num][i+1] } println("Date After :" + dateAfter) println("Current Date :" + CurrTime) var hour4 = self.substring(dateAfter,StartIndex: 1,EndIndex: 3) hour4 = hour4 + self.substring(dateAfter,StartIndex: 4,EndIndex: 6) var hour2 = self.substring(CurrTime,StartIndex: 1,EndIndex: 3) hour2 = hour2 + self.substring(CurrTime,StartIndex: 4,EndIndex: 6) var end_time = self.substring(End_Time_String,StartIndex: 1,EndIndex: 3) end_time = end_time + self.substring(End_Time_String,StartIndex: 4,EndIndex: 6) var hour_one = hour4.toInt() var hour_two = hour2.toInt() var hour_after = end_time.toInt() println("Blcok Date hour :") print(hour_one) println("Current Date hour:") print(hour_two) println("After Date hour :") println(hour_after) if(i == Widget_Block[Day_Num].count-1 && hour_two >= hour_one){ var EndTime = End_Times[Day_Num] if(hour_two! - EndTime < 0){ minutes_until_nextblock = self.find_Minutes(hour_two!, hour_after: (EndTime-5)) println("Miuntes until next blok" + String(minutes_until_nextblock)) if(minutes_until_nextblock > 0){ blockName_Widget = Widget_Block[Day_Num][i] } else{ blockName_Widget ="GETTOCLASS" } } else{ println("After School") blockName_Widget ="NOCLASSNOW" } break; } if(hour_two >= hour_one){ minutes_until_nextblock = self.find_Minutes(hour_two!, hour_after: (hour_after!-5)) println("Miuntes unitl next block" + String(minutes_until_nextblock)) if(minutes_until_nextblock > 0){ blockName_Widget = Widget_Block[Day_Num][i] } else{ blockName_Widget ="GETTOCLASS" } break; } } } if(blockName_Widget ==""){ blockName_Widget ="NOCLASSNOW" } println("Found the block name Widget" + blockName_Widget ) if(blockName_Widget =="NOCLASSNOW"){ println("NO Class Now") } else if(blockName_Widget =="GETTOCLASS"){ println("Passing Time") } else{ var firstLunch = Switch_Info[Day_Num] for (date,block) in Days[Day_Num].time_to_block{ var message = block; var block_copy = block; if(count(block_copy) == 2) { if(firstLunch && block_copy.hasSuffix("1")){ message ="Lunch" } else if(!firstLunch && block_copy.hasSuffix("2")){ message ="Lunch" } else{ var counterDigit = 0; for i in block_copy{ if(counterDigit == 0){ block_copy = String(i) } counterDigit++; } } } if(find(self.BlockOrder,block_copy) != nil){ var indexOfUserInfo = find(self.BlockOrder,block_copy)! if(User_Info[indexOfUserInfo] !=""){ message = User_Info[indexOfUserInfo] } } if(block == blockName_Widget){ println("have found widget block" + block) println("Message on Widget" + message) self.WidgetText.text = message break; } } } Success = true; } else { println("Information not received succesfully") } } return Success } |
}
最后错误很简单:我忘记了为了在我的主应用程序和我的小部件之间共享,我需要在 NSUserDefaults 中包含套件名称。小部件不断获取空对象并崩溃。
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类