Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 23

0
votes
answers
11 views
+10

UICollectionView崩潰下載時圖像

0

斯威夫特4: 我得到一個錯誤約UICollectionView崩潰下載時圖像

「意外發現零而展開的可選值」

和斷點是我downloadImage而我從JSON查詢中填入UICollectionView

有關我如何使這更安全的任何建議?還是我看錯了東西? 這裏是downloadImage代碼:

extension UIImageView { 
    @objc func downloadImage(from url: String){ 
     let urlRequest = URLRequest(url: URL(string: url)!) 
     let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in 

      if error != nil { 
       print(error as Any) 
       return 
      } 
      DispatchQueue.main.async { 
       if UIImage(data: data!) != nil { 
       self.image = UIImage(data: data!) 
       } 
      } 

     } 
     task.resume() 

    } 

這裏是函數填充的CollectionView它打破:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "articleCell", for: indexPath) as! ArticleCell 

     cell.title.text = self.articles?[indexPath.item].headline 

//這裏崩潰

cell.imgView.downloadImage(from: (self.articles?[indexPath.item].imageURL!)!) 

    cell.contentView.layer.cornerRadius = 0.5 
    cell.contentView.layer.borderWidth = 1.0 

    cell.contentView.layer.borderColor = UIColor.clear.cgColor 
    cell.contentView.layer.masksToBounds = true 

    cell.layer.shadowColor = UIColor.gray.cgColor 
    cell.layer.shadowOffset = CGSize(width: 0, height: 0.5) 
    cell.layer.shadowRadius = 1 
    cell.layer.shadowOpacity = 0.5 
    cell.layer.masksToBounds = false 
    cell.layer.shadowPath = UIBezierPath(roundedRect:cell.bounds, cornerRadius:cell.contentView.layer.cornerRadius).cgPath 


    return cell 


} 

這裏是控制檯輸出:

2017-12-18 06:55:08.412546+0100 Keyboard[81355:4788284] Failed to inherit CoreMedia permissions from 81260: (null) 
2017-12-18 06:55:08.634498+0100 Keyboard[81355:4788188] [MC] Lazy loading NSBundle MobileCoreServices.framework 
2017-12-18 06:55:08.635348+0100 Keyboard[81355:4788188] [MC] Loaded MobileCoreServices.framework 
2017-12-18 06:55:08.637140+0100 Keyboard[81355:4788188] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /Users/me/Library/Developer/CoreSimulator/Devices/9BAC6166-3559-4962-9715-F388A162E95F/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles 
Category: business 
true 
Fatal error: Unexpectedly found nil while unwrapping an Optional value 
2017-12-18 06:55:11.138236+0100 Keyboard[81355:4788188] Fatal error: Unexpectedly found nil while unwrapping an Optional value 
(lldb) 

這裏是調試:

libswiftCore.dylib`function signature specialization <preserving fragile attribute, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage(Swift.StaticString, Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never: 
    0x113a5e420 <+0>: pushq %rbp 
    0x113a5e421 <+1>: movq %rsp, %rbp 
    0x113a5e424 <+4>: pushq %r15 
    0x113a5e426 <+6>: pushq %r14 
    0x113a5e428 <+8>: pushq %r13 
    0x113a5e42a <+10>: pushq %r12 
    0x113a5e42c <+12>: pushq %rbx 
    0x113a5e42d <+13>: pushq %rax 
    0x113a5e42e <+14>: movl %r9d, %r14d 
    0x113a5e431 <+17>: movq %r8, %r15 
    0x113a5e434 <+20>: movq %rcx, %rbx 
    0x113a5e437 <+23>: movl %edx, -0x2c(%rbp) 
    0x113a5e43a <+26>: movq %rsi, %r13 
    0x113a5e43d <+29>: movq %rdi, %r12 
    0x113a5e440 <+32>: leaq 0x1c6551(%rip), %rdi  ; protocol descriptor for Swift._DefaultCustomPlaygroundQuickLookable + 136 
    0x113a5e447 <+39>: movl $0x28, %esi 
    0x113a5e44c <+44>: movl $0x7, %edx 
    0x113a5e451 <+49>: callq 0x113a826b0    ; swift_rt_swift_allocObject 
    0x113a5e456 <+54>: movq %rbx, 0x10(%rax) 
    0x113a5e45a <+58>: movq %r15, 0x18(%rax) 
    0x113a5e45e <+62>: movb %r14b, 0x20(%rax) 
    0x113a5e462 <+66>: movl 0x10(%rbp), %ecx 
    0x113a5e465 <+69>: movl %ecx, 0x24(%rax) 
    0x113a5e468 <+72>: leaq 0xd4c81(%rip), %rcx  ; partial apply forwarder for closure #2 (Swift.UnsafeBufferPointer<Swift.UInt8>) ->() in Swift._fatalErrorMessage(Swift.StaticString, Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never 
    0x113a5e46f <+79>: movq %r12, %rdi 
    0x113a5e472 <+82>: movq %r13, %rsi 
    0x113a5e475 <+85>: movl -0x2c(%rbp), %edx 
    0x113a5e478 <+88>: movq %rax, %r8 
    0x113a5e47b <+91>: callq 0x1138aa1b0    ; function signature specialization <preserving fragile attribute, Arg[1] = [Closure Propagated : reabstraction thunk helper from @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) ->() to @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> (@out()), Argument Types : [@callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) ->()]> of generic specialization <preserving fragile attribute,()> of Swift.StaticString.withUTF8Buffer<A>((Swift.UnsafeBufferPointer<Swift.UInt8>) -> A) -> A 
-> 0x113a5e480 <+96>: ud2  
    0x113a5e482 <+98>: nopw %cs:(%rax,%rax) 

這裏是你們在詢問該URL的控制檯輸出 - 它看起來像一個類別被點擊時,它的第一類加載的圖像確定,但隨後發現零。

Optional("http://www.afr.com/content/dam/images/h/0/6/g/p/6/image.related.socialLead.620x349.h06bfz.png/1513570709452.jpg") 
Optional("http://www.afr.com/content/dam/images/h/0/6/b/z/i/image.related.afrArticleLead.620x365.h06aej.png/1513559758977.jpg") 
Optional("http://www.afr.com/content/dam/images/h/0/6/f/x/o/image.related.afrArticleLead.620x365.h06bh0.png/1513563680637.jpg") 
Optional("http://assets1.ignimgs.com/2017/12/15/15234538txuhe2cy-1513377967388_1280w.jpg") 
Optional("http://assets1.ignimgs.com/2017/12/18/the-last-jedi-2-1513558653477_1280w.jpg") 
Fatal error: Unexpectedly found nil while unwrapping an Optional value 
2017-12-18 07:07:03.222266+0100 Keyboard[87661:4872775] Fatal error: Unexpectedly found nil while unwrapping an Optional value 
(lldb) 

我該如何優雅地接受函數中的這個nil值?

+0

可以粘貼你的崩潰日誌? –

+1

你的網址在這行中必須爲「self.articles?[indexPath.item] .imageURL!」。或者在這裏「URL(string:url)!」 。請檢查您的網址 –

+0

您可以調試以檢查此結果(self.articles?[indexPath.item] .imageURL!)!每次當你下載圖像。我認爲有一個URL –

沙发
0
2

嘗試下面的代碼,並總是試圖避免強制解包(!)。

extension UIImageView { 

@objc func downloadImage(from url: String){ 

    if let urlconvert = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),let urlConvertible = URL(string:urlconvert){ 

     let urlRequest = URLRequest(url: urlConvertible) 
     let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in 

      if error != nil { 
       print(error as Any) 
       return 
      } 
      DispatchQueue.main.async { 
       if let data = data { 

        self.image = UIImage(data: data) 
       } 
      } 

     } 
     task.resume() 

    } 
    } 

} 

變化這一個

cell.imgView.downloadImage(from: (self.articles?[indexPath.item].imageURL!)!) 

到:

if let imageURL = self.articles?[indexPath.item].imageURL{ 

cell.imgView.downloadImage(from: imageURL) 
} 
+0

感謝您的例子,不幸的是仍然看到相同的行爲 –

+0

嘗試改變cell.imgView.downloadImage – adarshaU

+0

這很好,我現在可以看到圖像不存在於每個返回的故事。謝謝! –

0
votes
answers
8 views
+10

在ios中切換任務時發生虛假旋轉事件11

2

當您在iPad上使用4指任務切換手勢切換時,我的應用程序在返回時崩潰。在ios中切換任務時發生虛假旋轉事件11

當用戶執行了4指手勢,從我的應用程序中切換出來,我在我的應用程序委託看到applicationWillResignActive:然後applicationDidEnterBackground:,然後(假設我們目前正處在縱向)我頂層視圖控制器獲取viewWillTransitionToSize:withTransitionCoordinator:與表示橫向佈局的大小(即使設備未旋轉)。這當然會導致很多調整和重新安排新方向的觀點。緊接着,我得到viewWillTransitionToSize:withTransitionCoordinator:,其大小指示肖像(設備的原始方向)。再次,我再次爲新的(實際上是原創的)方向進行我的佈局。

我在找的是如果我等待所有這些完成,我可以全天進入和退出我的應用程序。另一方面,如果在這個不必要的工作正在進行時切換回我的應用程序,我會在某些iOS轉換代碼中發生崩潰。

在這一點上,我試圖理解爲什麼我會得到這些流浪的旋轉事件。如果我能避免這些事情發生,我可以避免陷入任何導致事故發生的情況。他們似乎並不必要。

+1

感謝您指出這一點。起初我以爲我無法複製它,然後我意識到,我不僅可以重現它,而且事實上我的應用程序在App Store上充滿了崩潰報告! – matt

+0

我發現了另一種情況發生這種情況,當用戶在應用處於多任務狀態時單擊主頁按鈕時。當應用程序處於後臺狀態時,再次連續兩次「viewWillTransitionToSize」。 – matt

+0

我在想它這樣做的原因是它可以在橫向和縱向上快照應用程序,以便它可以在其正在運行的應用程序列表中顯示縮略圖。使用適當的代碼繞過後臺發生的方向更改,將橫向退出應用程序,旋轉至縱向,然後雙擊主屏幕以顯示正在運行的應用程序。你的屏幕截圖是錯誤的。我認爲要真正解決這個問題,我需要弄清楚我的旋轉/佈局代碼中觸發iOS中與重疊動畫相關的錯誤。與此同時,我推遲了佈局,直到我的應用程序變爲活動狀態。 – Craig

沙发
0
0

事實證明,沒有辦法阻止嚮應用程序報告輪換事件。我懷疑這是一個iOS錯誤。但是,在應用程序狀態爲UIApplicationStateBackground時忽略viewWillTransitionToSize:withTransitionCoordinator:,並在視圖的layoutSubviews(如果存在)中執行相同操作可以解決此問題。

板凳
0
1

我想不出有任何理由爲什麼它會是有用的或正確獲得viewWillTransitionToSize在後臺,所以只是反彈,如果你背景是

if UIApplication.shared.applicationState == .background { 
    return 
} 

不過,這種感覺就像一個錯誤,在我看來你應該向Apple報告。

+0

換句話說:如果你實現'layoutSubviews',它是否被調用與你是否實現'viewWillTransitionToSize'無關。但是,這不是你所要求的。 – matt

+0

我們是否應該刪除我們的評論?它會更乾淨。 – matt

+0

就像我建議的那樣,刪除所有評論。你的回答站立。評論是短暫的;我們用它們來討論如何進行。現在辯論結束了。 – matt

0
votes
answers
8 views
+10

setNavigationBar隱藏的動畫不能按預期在iPhone X上工作

1

我有通過隱藏UINavigationController的導航欄進入全屏模式的代碼。進入全屏時,我想要一個平滑的動畫縮放效果。我使用setNavigationBarHidden(_:animated:)。到目前爲止,這一切都運行良好,即使在iOS 11上,但在iPhone X上,動畫效果不佳。在隱藏時,沒有動畫,導航欄就消失了。在取消隱藏時,它具有動畫效果,但導航欄的顯示速度比導航控制器的內容區域縮小的速度要慢,因此在動畫過程中通過導航欄區域顯示一個醜陋的黑色背景。setNavigationBar隱藏的動畫不能按預期在iPhone X上工作

我可以在一個簡單的測試應用程序中重新創建。我有一個嵌入UINavigationController的UIViewController。

故事板

  • UINavigationController的導航欄:樣式==黑色;半透明關閉
  • UIViewController:延伸邊緣:所有選項關閉。

我已經嘗試了所有調整滾動視圖插圖和擴展邊緣的組合,我可以想到但他們沒有區別。

代碼

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    setFullScreen(on: fullScreen, animated: animated) 
} 

override var prefersStatusBarHidden: Bool 
{ 
    return fullScreen 
} 

override var preferredStatusBarStyle: UIStatusBarStyle 
{ 
    return .lightContent 
} 

@IBAction func onToggleNavBarVisibility(_ sender: Any) { 

    if let navBarHidden = self.navigationController?.isNavigationBarHidden { 
     // Toggle the state 
     fullScreen = !navBarHidden 

     setFullScreen(on: fullScreen, animated: true) 
    } 
} 

private func setFullScreen(on : Bool, animated : Bool) { 

    self.navigationController?.setNavigationBarHidden(on, animated: animated) 
    self.setNeedsStatusBarAppearanceUpdate() 
} 

Result on iPhone X (slow animations)

沙发
0
1

在你的情況,你正在使用barTintColor & navigationBarStyleShowHide都動畫。 barTintColor覆蓋在樣式屬性中所隱含的價值 你應該選擇barTintColornavigationBarStyle 在下面的代碼,我只是用barTintColor & navigationBarStyle是默認與Transulent

enter image description here

var fullScreen = false{ 
     didSet{ 
     self.setNeedsStatusBarAppearanceUpdate() 
    } 
    } 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     title = "Navigation Bar" 
     navigationController?.navigationBar.barTintColor = .red 
    } 
    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(true) 
     setFullScreen(on: fullScreen, animated: animated) 
    } 
    @IBAction func onToggleNavBarVisibility(_ sender: Any) { 
     if let navBarHidden = 
      self.navigationController?.isNavigationBarHidden { 
      // Toggle the state 
      fullScreen = !navBarHidden 
      setFullScreen(on: fullScreen, animated: true) 
     } 
    } 
    private func setFullScreen(on : Bool, animated : Bool) { 
     self.navigationController?.setNavigationBarHidden(on, animated: animated) 
     self.setNeedsStatusBarAppearanceUpdate() 
    } 

編輯: 如果要隱藏狀態酒吧, 使用prefersStatusBarHidden與布爾值。 &使用setNeedsStatusBarAppearanceUpdate

override var prefersStatusBarHidden: Bool { 
     return fullScreen 
    } 

https://developer.apple.com/documentation/uikit/uinavigationbar

+0

由於您的圖片顯示了過渡正常工作,它讓我明白這個問題更好。你的代碼工作的原因是你省略了prefersStatusBarHidden覆蓋,這似乎是根本原因。真的,我的問題標題是「setNavigationBarHidden動畫不適用於iPhone X上的prefersStatusBarHidden」。 註釋prefersStatusBarHidden覆蓋使我的代碼工作,雖然我想隱藏它來獲得全屏效果。 (我的原始代碼可以在iPhone X以外的所有iPhone模擬器上正常工作。) – Ben

+0

@Ben,請參閱編輯。它可以根據需要工作,用'UIApplication.shared.isStatusBarHidden = on'替換'prefersStatusBarHidden'。不過,在iPhone-X上保留狀態欄是很好的選擇,狀態欄也會顯示人們覺得有用的信息 – Jack

+0

有趣,而且絕對有幫助。不是完整的答案,因爲(1)狀態欄消失不動畫,如果我使用'UIApplication.shared.setStatusBarHidden(on,with:.fade)'我得到一個棄用警告; (2)當前Info.plist中'基於視圖控制器的狀態欄外觀'應該爲YES; (3)再現動畫還不完全正確。我感覺到一個錯誤報告... 如果您在iPhone X上使用照片應用程序,狀態欄會隱藏在全屏模式下,所以我想可以用它來做臨時演示的原因,我就是這樣。 – Ben

0
votes
answers
8 views
+10

試圖在iOS上使用FBShimmer可可豆莢但未找到Foundation框架

0

我試圖在iOS上使用FBShimmer可可豆莢但未找到Foundation框架。 PodFile shown here試圖在iOS上使用FBShimmer可可豆莢但未找到Foundation框架

enter image description here

enter image description here

+0

嘗試取消註釋use_frameworks!從您的podfile中,然後再次安裝。它可能有幫助。 –

+0

https://stackoverflow.com/questions/24750593/unknown-type-name-cgfloat-when-try-to-add-panoramagl-to-the-static-library/27902361 –

+0

@AaqibHussain我試過,但然後標題沒有找到橋接頭中列出的文件。 –

沙发
0
0

最後我只使用一個UIView擴展達到同樣的效果。更少的代碼和外部依賴。

func startShimmering() { 
    let light = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 
    let dark = UIColor.white.cgColor 

    let gradient: CAGradientLayer = CAGradientLayer() 
    gradient.colors = [dark, light, dark] 
    gradient.frame = CGRect(x: -self.bounds.size.width, y: 0, width: 3*self.bounds.size.width, height: self.bounds.size.height) 
    gradient.startPoint = CGPoint(x: 0.0, y: 0.4) 
    gradient.endPoint = CGPoint(x: 1.0, y: 0.5) 
    gradient.locations = [0.4, 0.5, 0.6] 
    self.layer.mask = gradient 

    let animation: CABasicAnimation = CABasicAnimation(keyPath: "locations") 
    animation.fromValue = [0.0, 0.1, 0.2] 
    animation.toValue = [0.8, 0.9, 1.0] 

    animation.duration = 3.0 
    animation.repeatCount = HUGE 
    gradient.add(animation, forKey: "shimmer") 


} 
0
votes
answers
8 views
+10

UILabel上的文本填充

1

在這裏,我試圖在文本週圍添加一些填充(左,右,上和下)的標籤。 這一問題已經在SOF和閱讀他們幾個後相關的帖子,我試圖用一個解決方案提出hereUILabel上的文本填充

這是我的子類的UILabel代碼:

import UIKit 

class LuxLabel: UILabel { 
    //let padding: UIEdgeInsets 
    var padding: UIEdgeInsets = UIEdgeInsets.zero { 
     didSet { 
      self.invalidateIntrinsicContentSize() 
     } 
    }  

    // Create a new PaddingLabel instance programamtically with the desired insets 
    required init(padding: UIEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)) { 
     self.padding = padding 
     super.init(frame: CGRect.zero) 
    } 

    // Create a new PaddingLabel instance programamtically with default insets 
    override init(frame: CGRect) { 
     padding = UIEdgeInsets.zero // set desired insets value according to your needs 
     super.init(frame: frame) 
    } 

    // Create a new PaddingLabel instance from Storyboard with default insets 
    required init?(coder aDecoder: NSCoder) { 
     padding = UIEdgeInsets.zero // set desired insets value according to your needs 
     super.init(coder: aDecoder) 
    } 

    override func drawText(in rect: CGRect) { 
     super.drawText(in: UIEdgeInsetsInsetRect(rect, padding)) 
    } 

    // Override `intrinsicContentSize` property for Auto layout code 
    override var intrinsicContentSize: CGSize { 
     let superContentSize = super.intrinsicContentSize 
     let width = superContentSize.width + padding.left + padding.right 
     let heigth = superContentSize.height + padding.top + padding.bottom 
     return CGSize(width: width, height: heigth) 
    } 
} 

它是基於PaddingLabel(參考上面的鏈接)。

它主要運行良好,但由於某些原因,我不明白,有些情況下出現問題並且顯示被截斷。

這是一個例子:

的字符串把標籤是:「它有一個方形和藍色」

創建標籤的代碼是:

let label = LuxLabel(padding: UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)) 
label.numberOfLines = 0 

,這是結果:

enter image description here

如果我此行添加到以上兩個:

label.lineBreakMode = .byWordWrapping

結果是:

enter image description here

我還設置了一些限制。所有這些工作都有95%的時間。任何人都可以看到有什麼問題?

+0

你有沒有設置'numberOfLines = 0'和'lineBreakMode = .byWordWrapping '? – Priya

+0

我已經設置numberOfLines = 0,但不lineBreakMode = .byWordWrapping。 我實際上有多個案例,多條線完美的工作。 它並沒有解決問題,如果我設置lineBreakMode = .byWordWrapping,我編輯我的帖子添加細節,請看看。 – Michel

+0

您是否爲標籤設置了靜態高度約束? – Priya

沙发
0
1

嘗試調用invalidateIntrinsicContentSize:

var padding: UIEdgeInsets = UIEdgeInsets.zero { 
    didSet { 
     self.invalidateIntrinsicContentSize() 
    } 
} 

編輯:

我嘗試了多種不同的選擇。如果更新frame sizelayoutSubviews使絕招intrinsicContentSize,但我不知道是否有更好的方式來做到這一點:

override func layoutSubviews() { 
    super.layoutSubviews() 
    self.frame.size = self.intrinsicContentSize 
} 
+0

我試過了,按照你的建議,用「var padding」代替「let padding」,但不幸的是它沒有任何區別。 – Michel

+0

@Michel明天我會試着重現它,如果我找到一些我會讓你知道的。 –

+0

我在GitHub(https://github.com/zaxonus/TextPad)上發佈了一個項目來展示這個問題。 – Michel

0
votes
answers
8 views
+10

收集研究參與者的Facebook發佈數據的最佳方法

-2

我正在與一個研究小組合作,這個研究小組需要在幾個月的過程中收集一組參與者的Facebook發佈數據。目標是讓參與者授權我們通過Facebook收集這些信息,當他們發佈到Facebook時,將這些信息發送到安全服務器。收集研究參與者的Facebook發佈數據的最佳方法

閱讀Facebook文檔後,我大多隻是對如何爲用戶提供一種機制來同意收集他/她的數據的條款感到困惑。我正計劃使用webhook來收集獨立於客戶端平臺的數據,但是我真的需要爲Web,iOS和Android構建單獨的應用程序,以供審批嗎?

沙发
0
2

我打算使用webhooks來收集數據,這是獨立於客戶端平臺,但我真的需要爲web,iOS和Android構建單獨的應用程序,僅用於審批過程嗎?

無論如何,您很可能不會在審覈中獲得此批准。

權限必須大部分用於爲應用內用戶體驗提供直接益處;僅爲分析性措施收集數據明確提及爲不允許的用例。用戶是否同意在這裏不相關。

例如,user_posts權限,具有「不可見使用這種數據,如情緒分析或防範垃圾郵件程序」標有紅色「X」爲都能跟得上

因此,讓應用程序向用戶請求必要權限的唯一方法就是通過應用程序面板/ API將它們作爲測試人員添加到應用程序中。任何人都可以在應用程序中發揮作用,可以請求任何許可,也可以不進行審查。然而,在你的應用程序可以將他們的請求發送給測試人員之前,這些用戶必須驗證他們的帳戶(移動/文本,信用卡)並在FB平臺上註冊爲「開發人員」。

可以這麼說,你會在雷達下飛翔。 Facebook提供這個「漏洞」主要是爲了讓開發人員在審查之前正確測試和開發他們的應用程序。在應用程序開發常見問題解答中,也明確提到了這一點,作爲考慮需要的一種方式,可用於特定用例,例如希望自動將您的博客文章發佈到您自己的FB頁面。它不會涵蓋你想要做的事情,但只要你的測試用戶沒有專門向Facebook提出投訴就可能「工作」......

不確定是否有任何發佈的限制可以添加到應用程序的測試用戶數量,人們過去已經詢問過,但AFAIK沒有記錄或由Facebook發佈。如果有一個,並且它不是完全停止這種方法(例如,每個應用程序只有幾百個而不是五個),則可以使用多個應用程序標識,如果不需要關聯數據,則可以使用多個應用程序標識()用戶帳戶太多 - 因爲應用程序範圍的用戶ID會因應用程序ID而有所不同,因此可能會使不同「應用程序ID測試組」中的朋友之間的聯繫變得困難。或者您可能需要引用其他不太可靠的唯一標??識它們的措施,例如電子郵件或個人資料名稱。

+1

順便說一句,根據[測試用戶規則](https://developers.facebook.com/docs/apps/test-users#rules),現在看起來最大測試用戶是2000。 – foundling

+0

@foundling酷,不知道他們現在給一個具體的數字。 – CBroe

0
votes
answers
7 views
+10

殺死一個線程或替代

1

有什麼辦法,我可以通過殺死一個線程產卵:殺死一個線程或替代

[NSThread detachNewThreadSelector:@selector(serverFetchInThread) toTarget:self withObject:nil]; 

我工作的情況是,在我的主線程我又讓用戶在我的搜索欄輸入數據和什麼用戶輸入我需要發送到服務器在單獨的線程中搜索。現在,如果用戶通過刪除舊數據並輸入新數據來更改他的選擇,我不希望以前的線程浪費時間,殺死它並用新數據產生一個新線程。

有沒有其他更好的方法來處理這種情況,請指導我。

沙发
0
3

不,沒有辦法殺死另一個線程的線程。有充分的理由,因爲沒有辦法這樣做,即殺死目標線程而沒有崩潰應用程序的風險。

直接回答你的問題;你需要有一種標誌,告訴線程它應該停止正在做的事情並退出。

首先,你爲什麼要使用線程和不使用GCD:

然而,一對夫婦的問題,是由你的問題提出?通過GCD或NSOperation進行併發是解決此類問題的一般建議方法。其次,如果您正在與服務器交談,您是否使用HTTP(大多數情況下,情況就是如此)?如果是這樣,爲什麼不直接使用NSURL和朋友的異步功能呢?

+0

謝謝。我正在使用異步HTTP連接。你能否給我們提供一些更多關於使用標誌和指示線程停止運行的信息。我將在主線程中設置標誌,對吧?我如何在單獨的線程中讀取它。 – Abhinav 2011-03-26 19:31:52

+0

只需調用它的'cancel'方法就可以停止NSHTTPConnection。 – peterjb 2011-03-26 19:42:30

+0

這是正確的,但一旦一個asyc服務器調用在一個線程中,我怎麼能從主線程調用它的取消方法。 – Abhinav 2011-03-26 20:39:21

板凳
0
1

請仔細閱讀使用NSOperationQueue

您可以繼承NSOperation以包裝您的服務器通信,甚至可以創建隊列序列(最大操作數= 1)。

如果服務器操作尚未完成並且用戶已生成更多輸入,則可以取消現有的操作並添加新操作。

由於包裝連接的NSOperation的影響,您可以使用簡單的同步版本,並保持連接處理非常簡單。

另外值得一提的是兼容性。我寧願使用GCD和塊,但爲了兼容性,需要NSOperationQueue

0
votes
answers
7 views
+10

使用InAppBillingPlugin恢復購買

0

我目前使用James Montemagno的InAppBillingPlugin在我的應用程序中部署訂閱程序。使用InAppBillingPlugin恢復購買

它工作正常,但我需要在應用程序中進行恢復購買功能,我遇到了這個問題。

我遵循documentation上說明的過程,但是當我調用函數GetPurchaseAsync()時,我得到的Enumerable對象中沒有任何東西。

You can see the complete object in the picture

我與我的真實蘋果商店帳戶嘗試,我買了一個產品,在生產中的實際應用,並試圖與我在開發應用程序恢復我的購買。

如果有人知道我可以改正這一點,這將是非常有益的!

+0

當一個lib發生意想不到的事情時,我會做什麼,下載它的源代碼,包括我的項目,以完全調試內部發生的事情,以及爲什麼.. –

+0

當您在生產環境中購買時,您無法恢復購買開發。兩者都有單獨的InApp購買網址。 –

沙发
0
0

請勿使用您的真實Apple帳戶在開發環境中測試生產應用程序。它不會工作。
如果您想用開發環境測試您的應用程序內購買。請將您的Apple帳戶更改爲測試用戶帳戶並使用沙箱環境。關於如何創建應用程序自己的測試帳戶,您可以參考:Create a sandbox tester account
請注意,文本「[Environment:Sandbox]」作爲提示的一部分出現,表示您已連接到測試環境。有關如何檢索產品信息的更多詳細信息,請參閱here

+0

謝謝,我知道沙盒,我已經試過了,但枚舉購買只包含沒有任何PurchaseToken的購買,這就是爲什麼我嘗試與生產在應用程序購買... – nicar

+0

@nicar你可以嘗試分享一些關於您購買的產品,我認爲我們可以在沙盒中獲得我們需要的信息。 –

+0

我用來允許恢復購買的代碼: 'var purchases = await billing.GetPurchasesAsync(ItemType.InAppPurchase); 的foreach(在購買VAR購買) { 如果(purchase.PurchaseToken!= NULL)' 在最後的代碼「如果」永遠不會被調用,當我看在購買,我可以看到這一點:[購買可枚舉] (https://imgur.com/upIGZBs) 發送回來的所有對象都包含與TransactionDateUtc完全相同的事物,只有ID不同。這在沙箱中的購買是在不同的日子完成的,這是沒有意義的。 – nicar

0
votes
answers
7 views
+10

如何管理全局變量

1

我知道這是非常基本的東西,但我需要知道如何聲明/賦值/使用全局變量。如何管理全局變量

,因爲我已經聲明的變量全局那就是:

enter image description here

現在我將它從服務器響應geeting像

enter image description here

現在在控制檯我很值在該全局變量中獲取輸出。

enter image description here

現在,我的問題是,當我使用全局變量值作爲參數值的方式來調用API將採取零。沒有得到正確的值

enter image description here

感謝指南

+0

似乎你從服務器獲取數據後,爲本地變量賦值,而不是全局變量,只需從指定值的局部變量中刪除var關鍵字。 – Nilesh

+0

當我刪除var給錯誤:不能下標類型'JSON'的值的類型'字符串'的索引 –

+0

你想要'全局'變量超出視圖控制器本身嗎? –

沙发
0
2

剛剛從那裏你賦值局部變量刪除VAR關鍵字,並添加下面的代碼來代替。

global_userid = ["(oDict["userResult"][0]["user_id"])"] 
global_reqid = ["(oDict["userResult"][0]["request_id"])"] 
+1

非常接近它將採取user_id但沒有采取有效的request_id –

+1

感謝兄弟...現在工作正常.... –

+0

歡迎,兄弟... – Nilesh

0
votes
answers
7 views
+10

用UIView繪製漸變畫()用swift

3

我想在所有視圖中放入漸變背景。用UIView繪製漸變畫()用swift

我認爲這樣做的方式不需要在所有視圖控制器中創建視圖的IBOutlet,就是從UIView創建一個新類,然後在draw()中放入使CAGradientLayer成爲代碼的代碼風景。

因此,在界面生成器中,我只需要選擇背景視圖並將其類設置爲我的自定義類。它到目前爲止工作。

我的問題是如果我可以做到這一點沒有問題。有人知道可以嗎? 因爲從UIView繼承的模型文件附帶註釋: //如果執行自定義繪圖,則只能覆蓋draw()。

而且我不知道是否創建圖層數量。或者,如果draw()僅適用於低級繪圖或類似的東西。對draw()函數的最佳用法一無所知。

這是代碼:

override func draw(_ rect: CGRect) { 

     let layer = CAGradientLayer() 
     layer.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height) 

     let color1 = UIColor(red: 4/255, green: 39/255, blue: 105/255, alpha: 1) 
     let color2 = UIColor(red: 1/255, green: 91/255, blue: 168/255, alpha: 1) 

     layer.colors = [color1.cgColor, color2.cgColor] 
     self.layer.addSublayer(layer) 
    } 
+0

您需要爲您的梯度層的位置屬性,您可以瞭解更多。 –

沙发
0
2

想,你可以使用@IBDesignable@IBInspectable配置從故事板startColor和ENDCOLOR屬性,你可以有儘可能多的顏色。如果要繪製draw(_ rect :)方法,請使用CGGradient指定顏色和位置,而不是CAGradientLayer。簡單漸變類和draw(_ rect: CGRect)功能看起來像這樣

import UIKit 

@IBDesignable class GradientView: UIView { 

    @IBInspectable var startColor: UIColor = UIColor(red: 4/255, green: 39/255, blue: 105/255, alpha: 1) 
    @IBInspectable var endColor: UIColor = UIColor(red: 1/255, green: 91/255, blue: 168/255, alpha: 1) 

    override func draw(_ rect: CGRect) { 

     let context = UIGraphicsGetCurrentContext()! 
     let colors = [startColor.cgColor, endColor.cgColor] 

     let colorSpace = CGColorSpaceCreateDeviceRGB() 

     let colorLocations: [CGFloat] = [0.0, 1.0] 

     let gradient = CGGradient(colorsSpace: colorSpace, 
            colors: colors as CFArray, 
            locations: colorLocations)! 

     let startPoint = CGPoint.zero 
     let endPoint = CGPoint(x: 0, y: bounds.height) 
     context.drawLinearGradient(gradient, 
          start: startPoint, 
          end: endPoint, 
         options: []) 
    } 
} 

heretutorial

+0

謝謝。我認爲我正在尋找更近的人。並且效果很好。 – Aisenhein

+0

使用IBInspectable和IBDesignable的好主意,使它非常完美。 – Aisenhein

+0

它幫助很大。現在,您可以爲Storyboard配置不同視圖的值。 – suhit

板凳
0
0

你不應該添加一個CAGradientLayer的draw函數內。

如果你想一個梯度添加到視圖那麼最簡單的方法是用層做(比如你正在做的),但不喜歡這個......

你應該把它添加到您的視圖init方法的一部分,然後在佈局子視圖方法中更新其框架。

事情是這樣的......

class MyView: UIView { 
    let gradientLayer: CAGradientLayer = { 
     let l = CAGradientLayer() 
     let color1 = UIColor(red: 4/255, green: 39/255, blue: 105/255, alpha: 1) 
     let color2 = UIColor(red: 1/255, green: 91/255, blue: 168/255, alpha: 1) 
     l.colors = [color1.cgColor, color2.cgColor] 
     return l 
    }() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     layer.addSublayer(gradientLayer) 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     gradientLayer.frame = bounds 
    } 
} 
+0

感謝您的回答。但是通過這段代碼,沒有顯示漸變。我只是有一個白色背景(我的視圖本身的顏色)。 我需要調用init(frame)的某個地方嗎?我認爲它從來沒有被稱爲。 xcode需要給我一個init(編碼器),我可以在其內部調用init(幀)嗎? – Aisenhein

地板
0
0

我想創建的UIView延伸並在需要時使用它。

extension UIView { 
     func withGradienBackground(color1: UIColor, color2: UIColor, color3: UIColor, color4: UIColor) { 
      let layerGradient = CAGradientLayer() 

      layerGradient.colors = [color1.cgColor, color2.cgColor, color3.cgColor, color4.cgColor] 
      layerGradient.frame = bounds 
      layerGradient.startPoint = CGPoint(x: 1.5, y: 1.5) 
      layerGradient.endPoint = CGPoint(x: 0.0, y: 0.0) 
      layerGradient.locations = [0.0, 0.3, 0.4, 1.0] 

      layer.insertSublayer(layerGradient, at: 0) 
     } 
} 

在這裏,您可以更改FUNC聲明指定爲startPointendPointlocations PARAMS作爲變量。

之後,只需調用這個方法就像

gradienView.withGradienBackground(color1: UIColor.green, color2: UIColor.red, color3: UIColor.blue, color4: UIColor.white) 

附: 請注意,您在colors陣列

+0

但是通過這個擴展,我將需要在所有視圖控制器中創建視圖的出口以調用梯度函數。我想避免這種情況。不管怎麼說,還是要謝謝你。 – Aisenhein