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 Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 2

5
votes
answers
136 views
+10

ITMS-90809:不推荐使用的API使用 - Apple将停止接受使用UIWebView API的应用程序的提交

昨天,我将我的应用程序上传到TestFlight,过了一段时间Apple向我发出了这个警告:

ITMS-90809:不推荐使用的API使用 - Apple将停止接受使用UIWebView API的应用程序的提交。有关更多信息,请参见 https://developer.apple.com/documentation/uikit/uiwebview 信息。

问题是我不在我的应用程序中使用UIWebView,所以我尝试更新我的pod但仍然是同样的事情。这就是我在TestFlight上的第3次构建,这是第一次时间苹果发给我这个。有什么想法吗?

更新

这些是我的播客:

  pod'Firebase / Core'pod'
    
        
沙发
+40
+50

您可以检查已归档应用程序中的每个框架,以查看其中是否有任何框架引用 UIWebView 从命令行, cd 到存档的应用程序,例如:

  cd~ / Library / Developer / Xcode / Archives /< date> /myapp.xcarchive/产品/应用程序/ myapp.app   

在那里,使用 nm 命令转储应用程序的符号和每个应用程序的框架:

  nm myapp | 框架/ *框架中的框架grep UIWeb; do fname = $(basename $ framework .framework)echo $ fname nm $ framework / $ fname | grep UIWeb完成  

这至少会告诉你哪个框架是罪魁祸首。

谢谢你的回答它帮了很多忙。我将用更多信息更新我的问题。 - Nick Stefanidis 8月31日15:23

所以现在我唯一能做的就是等待谷歌解决问题? - Nick Stefanidis昨天

是的,您需要等待(或自行修复并提交拉取请求)。我不确定删除UIWebView的所有用途的具体截止日期是什么,但我非常怀疑它将在今年秋季发布iOS 13之前。 - Rudedog 12小时前

好的。谢谢你的帮助。 - Nick Stefanidis 8小时前

+10

检查您是否在代码中使用了UIWebView类; 如果是用WKWebView替换你的实现,否则需要检查你的Pod。

使用终端进入项目文件夹并执行命令: grep -r“UIWebView”。

必须更新所有匹配的pod。现在我被困了,因为我发现了UIWebView进入谷歌AdMob(版本7.49.0),我正在等待谷歌的新版本。

0
votes
answers
33 views
+10

如何解決Swift中的「預期聲明」錯誤?

-1

我有點誤解如何正確使用 - (void)。每當我嘗試使用 - (Void)編寫代碼,但出現錯誤「Expected declaration」或有時「Binary operator '-' cannot be applied to operands of type 'UIFont' and '(Void).Type'」。如何解決Swift中的「預期聲明」錯誤?

這是怎麼發生的?在swift中正確使用此功能的正確方法是什麼?

{

- (Void)keyboardWillShow { //>> showing me the error "Binary operator '-' cannot be applied to operands of type 'UIFont' and '(Void).Type'" 
     // Animate the current view out of the way 
     if (self.view.frame.origin.y >= 0) 
     { 
      [self setViewMovedUp:YES]; 
     } 
     else if (self.view.frame.origin.y < 0) 
     { 
      [self setViewMovedUp:NO]; 
     } 
    } 

}

感謝

+1

請通讀了雨燕編程語言[Apple的文檔(https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/index.html)。 –

+1

用導致問題的實際代碼更新您的問題。 – rmaddy

+1

這是Objective-C代碼,而不是Swift代碼。請閱讀[Swift編程語言](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/)書。 – rmaddy

沙发
0
5

這聽起來像你想聲明沒有返回值的函數。在斯威夫特這樣做是因爲:

func thisFunction() { 
    .. 
} 
板凳
0
-2

可以回到零值,如下面的代碼:

func myFunc(myVar: String) ->()? { 
    print(myVar) 
    return nil 
    } 
var c = myFunc("Hello") 
print(c) // nil 

但斯威夫特功能總是返回默認值零,如果沒有聲明。如下面的代碼:

func myFunc(myVar: String) { 
     print(myVar) 
     return 
     } 
    var c = myFunc("Hello") 
    print(c) //() 
+0

* Swift函數總是返回默認值nil,如果沒有聲明*是錯誤的。在第二個例子中,你會得到一個編譯器錯誤(實際上兩個在Swift 3+中)。 – vadian

+1

*「如果未聲明,Swift函數總是返回默認值nil」* - 否,這是不正確的。 – rmaddy

+0

嚴格地說,即使沒有定義返回值,myFunc(myVar :)函數的這個版本仍然會返回一個值。沒有定義返回類型的函數返回一個特殊的Void類型值。這只是一個空元組,寫成()。 –

0
votes
answers
58 views
+10

獲取位於Google Firestore中文檔內的收藏ID

1

這是一個包含2個收藏的「TestAccount」文檔。有沒有辦法在查詢「TestAccount」文檔時知道集合名稱?獲取位於Google Firestore中文檔內的收藏ID

enter image description here

這不會打印出集合名稱:

db.collection("users").document("TestAccount").getDocument { (allDocs, allDocsErrors) in 
     guard let _allDocs = allDocs, 
      allDocs?.exists ?? false, 
      allDocsErrors == nil else { 
       print("early exit (allDocs?.exists)") //always fires 
       return 
     } 
+0

檢查這鏈接https://firebase.google.com/docs/firestore/query-data/get-data#list_subcollections_of_a_document –

沙发
0
0

結賬這段代碼,我刪除了allDocs?.exists ?? false,allDocsErrors == nilguard條件列表中,這應該做工精細

db.collection("users").document("TestAccount").getDocument 
{ 
    (documentSnapshot, error) in 

    guard let documentSnapshot = documentSnapshot else { 
     print("early exit (documentSnapshot?.exists)"); 
     return 
    } 

    let children = documentSnapshot.data(); 
    for (id , value) in children 
    { 
     print(id); 
    } 

} 
0
votes
answers
55 views
+10

如何使用segue將兩個文本字段項傳遞給另一個ViewController

0

我希望我的用戶在進入「id」和「password」後轉到TableViewController,但是當我們使用prepare和performsegue方法時,我們只發送一個變量。如何使用segue將兩個文本字段項傳遞給另一個ViewController

@IBAction func logIn(_ sender: Any) { 
    performSegue(withIdentifier: "emailSegue", sender: emailTextField.text) 
    performSegue(withIdentifier: "passwordSegue", sender: passwordTextField.text) 
} 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let guest = segue.destination as! ExpenseTableViewController 

    guest.incoming.append(sender as! String) 
} 

正如你可以看到這裏我想執行兩種不同的塞格斯,我也創造了從視圖控制器命名爲「emailSegue」和「passwordSegue」的tableview控制器故事板2個塞格斯,但在準備功能我當我運行代碼時,它只能爲其中一個「emailSegue」做準備,它會編譯,並且可以將電子郵件附加到數組中,但不能附加密碼。

所以我想知道如何讓他們都被髮送?有沒有辦法爲2個不同的賽段做準備?無法在其他地方找到它的例子。

在此先感謝。

+0

你一次只能一次繼續。你不能同時出現兩個視圖控制器。 –

+0

你可以'繼續'到一個視圖控制器,你也可以發送數據到不同的視圖控制器在繼續之前 – julekgwa

沙发
0
1

您只能執行一個 segue,但您可以發送多個參數。

只是傳遞一個數組而不是一個字符串:

@IBAction func logIn(_ sender: Any) { 
    performSegue(withIdentifier: "emailSegue", 
       sender: [emailTextField.text!, passwordTextField.text!]) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "emailSegue" { 
     let guest = segue.destination as! ExpenseTableViewController 
     guest.incoming.append(contentsOf: sender as! [String]) 
    } 
} 

PS:不是被迫展開了text性能應驗證它們:

@IBAction func logIn(_ sender: Any) { 
    guard let email = emailTextField.text, !email.isEmpty, 
     let password = passwordTextField.text, !password.isEmpty else { 
     // show an alert 
     return 
    } 
    performSegue(withIdentifier: "emailSegue", sender: [email, password]) 
} 
+0

你是一個拯救生命的人!謝謝。 – emrepun

板凳
0
0

您可以一次只執行一個SEGUE,所以當你希望發生的事情,並設置在prepareForSegue兩個變量爲目標視圖控制器過渡調用performSegue只有一次。最好通過檢查segue.identifier屬性來檢查應該準備哪種類型的繼續。

+0

非常感謝!我解決了我的問題,非常感謝! – emrepun

+0

很高興聽到! :) – eirikvaa

0
votes
answers
71 views
+10

在Alamofire請求參數中傳遞CSRF令牌

0

我想在我的網站上登錄一個用戶,該用戶的登錄表單中有一個CSRF令牌。我在iOS上使用Alamofire和Swift。在Alamofire請求參數中傳遞CSRF令牌

這裏是形式的代碼:

    <form id="login-form" class="body" action="login" method="post"> 

           <div class="form-group label-floating"> 
            <label class="control-label" for="username">Identifiant</label> 
            <input id="username" type="text" name="username" class="form-control" required/> 
           </div> 

           <div class="form-group label-floating"> 
            <label class="control-label" for="password">Mot de passe</label> 
            <input id="password" type="password" name="password" class="form-control" 
              required/> 
           </div> 

           <div class="footer"> 
                     <div class="col-md-offset-3 col-md-6"> 
             <input type="hidden" id="csrf_token" name="_csrf" 
               value="7cf3b95d-1310-4d00-b1b2-7040340b12e6"/> 
             <button type="submit" class="btn btn-lg btn-primary btn-block"> 
              Connexion 
             </button> 
            </div> 
           </div> 
          </form> 

我創建它返回CSRF令牌的功能。然後我調用另一個函數來記錄用戶憑證和CSRF令牌。

下面是這個函數:

func login(token: String, completion: @escaping (_ success: Bool) -> Void) { 

     let customerURL = "https://mywebsite.com/uaa/login" 
     let user = "username" 
     let password = "password" 
     let parameters = [ "username" : user, "password" : password, "Authorization" : token] 

     Alamofire.request(customerURL, method: .post, parameters: parameters, encoding: JSONEncoding.default) 

      .responseString { response in 

       switch response.result { 
       case .success: 
        print("Validation Successful") 
        if let JSON = response.result.value { 
         print(JSON) 
        } 
       case .failure(let error): 
        print(error) 

       } 
     } 
    } 

但是當我運行我的應用程序,這裏是我得到:

{"timestamp":1510425797543,"status":403,"error":"Forbidden","message":"Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-XSRF-TOKEN'.","path":"/uaa/login"} 

任何想法?在此先感謝您的幫助!

沙发
0
0
'null' was found on the request parameter '_csrf' 

我看你使用的是「授權」名參數,而從讀它「_csrf」的API compline參數從「授權」到「_csrf」

的名字從

改變
let parameters = [ "username" : user, "password" : password, "Authorization" : token] 

let parameters = [ "username" : user, "password" : password, "_csrf" : token] 
0
votes
answers
39 views
+10

斯威夫特:地圖返回4個值作爲2點之間的距離,爲什麼?

0

我計算2點之間的距離。對於第一點,我分配了緯度和經度。第二個座標點在用戶點擊地圖的任何位置進行協調。每件事情都很完美,除了四次打印的答案。斯威夫特:地圖返回4個值作爲2點之間的距離,爲什麼?

  • 我試着返回第一個索引(原來第一個索引是4 的值)。
  • 我試圖將這些值添加到一個集以刪除重複的(它沒有工作)。
  • 我試圖做一個循環,並在第一次後中斷(仍然返回4個值)。 這裏我在哪裏創建用戶點擊(內viewdidAppear)註釋:

let uilpgr = UILongPressGestureRecognizer(target: self, action: #selector(MapViewController.longpress(gestureRecognizer:))) 
     uilpgr.minimumPressDuration = 2 
     map.addGestureRecognizer(uilpgr) 

這是計算的距離(功能viewdidAppear後)功能:

@objc func longpress(gestureRecognizer: UIGestureRecognizer){ 
    let touchPoint = gestureRecognizer.location(in: self.map) 
    let coordinates = map.convert(touchPoint, toCoordinateFrom: self.map) 
    let annotation = MKPointAnnotation() 
    annotation.coordinate = coordinates 
    annotation.title = "Destination" 
    map.addAnnotation(annotation) 

    let source = CLLocation(latitude: 5, longitude: 5) 

    let distination = CLLocation(latitude: coordinates.latitude, longitude: coordinates.longitude) 

    let distanceInMeters = source.distance(from: distination) 
    let distanceInMiles = String(Int(distanceInMeters/1.6)) 

    myArrayDataStructure.myArray.append(distanceInMiles) 
    UserDefaults.standard.set(myArrayDataStructure.myArray, forKey: "items") 
} 
沙发
0
1

你的問題是你如何處理手勢。 「長按」手勢(與其他人一樣)有幾種狀態。當手勢開始時,手勢結束時,手勢被取消時以及在「長按」情況下手勢被更新時,會調用手勢動作。

只有當手勢狀態爲「結束」時,纔想執行距離計算。

@objc func longpress(gestureRecognizer: UIGestureRecognizer){ 
    if gestureRecognizer.state = .ended { 
     // your code here 
    } 
} 
0
votes
answers
49 views
+10

在Wordpress頁面上顯示Swift 4源代碼

-1

有人可以告訴我在wordpress頁面上在線顯示Swift 4源代碼的最佳方式嗎?是否有任何有用的插件可以處理Swift 4或任何方式從xcode複製到RTF> HTML轉換器?我看到的唯一插件叫Crayon,但是它自2年以來沒有更新。 感謝您的任何輸入。在Wordpress頁面上顯示Swift 4源代碼

沙发
0
-1

似乎沒有任何好的選擇,但這篇文章有一些建議,加上所有可用於WordPress的插件列表。

https://codex.wordpress.org/Writing_Code_in_Your_Posts

0
votes
answers
53 views
+10

AVMutableAudioMix將多個音量更改爲單個軌道

0

我正在研究將多個視頻剪輯合併爲一個最終視頻的應用程序。如果需要,我想讓用戶能夠將單個剪輯靜音(因此,只有部分最終合併的視頻會被靜音)。我已將AVAsset包裝在名爲「Video」的類中,該類具有「shouldMute」屬性。AVMutableAudioMix將多個音量更改爲單個軌道

我的問題是,當我將其中一個AVAssetTrack的音量設置爲零時,它對於最終視頻的剩餘部分保持靜音。這裏是我的代碼:

var completeDuration : CMTime = CMTimeMake(0, 1) 
    var insertTime = kCMTimeZero 
    var layerInstructions = [AVVideoCompositionLayerInstruction]() 
    let mixComposition = AVMutableComposition() 
    let audioMix = AVMutableAudioMix() 

    let videoTrack = 
     mixComposition.addMutableTrack(withMediaType: AVMediaType.video, 
             preferredTrackID: kCMPersistentTrackID_Invalid) 
    let audioTrack = mixComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid) 


    // iterate through video assets and merge together 
    for (i, video) in clips.enumerated() { 

     let videoAsset = video.asset 
     var clipDuration = videoAsset.duration 

     do { 
      if video == clips.first { 
       insertTime = kCMTimeZero 
      } else { 
       insertTime = completeDuration 
      } 


      if let videoAssetTrack = videoAsset.tracks(withMediaType: .video).first { 
       try videoTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, clipDuration), of: videoAssetTrack, at: insertTime) 
       completeDuration = CMTimeAdd(completeDuration, clipDuration) 
      } 

      if let audioAssetTrack = videoAsset.tracks(withMediaType: .audio).first { 
       try audioTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, clipDuration), of: audioAssetTrack, at: insertTime) 

       if video.shouldMute { 
        let audioMixInputParams = AVMutableAudioMixInputParameters() 
        audioMixInputParams.trackID = audioTrack!.trackID 
        audioMixInputParams.setVolume(0.0, at: insertTime) 
        audioMix.inputParameters.append(audioMixInputParams) 
       } 
      } 

     } catch let error as NSError { 
      print("error: (error)") 
     } 

     let videoInstruction = videoCompositionInstructionForTrack(track: videoTrack!, video: video) 
     if video != clips.last{ 
      videoInstruction.setOpacity(0.0, at: completeDuration) 
     } 

     layerInstructions.append(videoInstruction) 
     } // end of video asset iteration 

如果我再添setVolume:atTime指令增大音量回1.0在剪輯的結尾,則第一個卷指令被完全忽略,並且在最大音量的整個視頻播放。

換句話說,這是行不通的:

if video.shouldMute { 
        let audioMixInputParams = AVMutableAudioMixInputParameters() 
        audioMixInputParams.trackID = audioTrack!.trackID 
        audioMixInputParams.setVolume(0.0, at: insertTime) 
        audioMixInputParams.setVolume(1.0, at: completeDuration) 
        audioMix.inputParameters.append(audioMixInputParams) 
       } 

我已經設置了audioMix我AVPlayerItem和AVAssetExportSession兩者。我究竟做錯了什麼?我能做些什麼來讓用戶在合併到最終視頻之前將單個剪輯的時間範圍設爲靜音?

沙发
0
0

顯然我正在討論這個錯誤。正如你在上面看到的,我的作品有兩個AVMutableCompositionTracks:一個視頻軌道和一個音軌。儘管我將一系列其他曲目的時間範圍插入到這兩個曲目中,但最終還是隻有兩個曲目。所以,我只需要一個AVMutableAudioMixInputParameters對象與我的一個音軌相關聯。

我初始化了一個AVMutableAudioMixInputParameters對象,然後在插入每個剪輯的時間範圍之後,我會檢查它是否應該靜音,併爲剪輯的時間範圍設置音量斜坡(時間範圍的關係到整個音軌)。下面是我的片段迭代內容:

if let audioAssetTrack = videoAsset.tracks(withMediaType: .audio).first { 
       try audioTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, clipDuration), of: audioAssetTrack, at: insertTime) 

       if video.shouldMute { 
        audioMixInputParams.setVolumeRamp(fromStartVolume: 0.0, toEndVolume: 0.0, timeRange: CMTimeRangeMake(insertTime, clipDuration)) 
       } else { 
        audioMixInputParams.setVolumeRamp(fromStartVolume: 1.0, toEndVolume: 1.0, timeRange: CMTimeRangeMake(insertTime, clipDuration)) 
       } 
      } 
0
votes
answers
51 views
+10

將輸入到UITextField的內容轉換爲類似於00:01的計數器號碼

1

我有一個UITextField,其中鍵盤類型是一個數字鍵盤。我希望能夠鍵入數字因此它們被格式化爲一個時間,例如:00:00將輸入到UITextField的內容轉換爲類似於00:01的計數器號碼

對於實施例
打字1 - >00:01
打字1,2 - >00:12
打字1,2 3 - >01:23
打字1,2,3,4 - >12:34

12:34象徵12 minutes and 32 seconds

此外,一旦您達到最多4位數字,鍵入更多將不會執行任何操作。

我也想將任何輸入的內容,例如01:23轉換成秒的Int - 例如, 83在這種情況下 - 如果可能的話。

+0

你嘗試了什麼?請顯示一些代碼... –

+0

我試過這個,但很多錯誤,並不完全是我想要的:https://stackoverflow.com/a/34239761/7842955 – Loctor

+0

它只是邏輯。閱讀最不重要的秒爲秒和最重要的數字爲小時。將其保留爲一個字符串並將其轉換爲秒數 – ahmed

沙发
0
0

您使用Int返回文本字段,並在用戶按下某個鍵時修改Int。然後,將格式化的Int顯示爲文本。這裏是一個遊樂場的例子:

import PlaygroundSupport 

import UIKit 

class ViewController: UIViewController { 
    var textField = UITextField(frame: CGRect(x: 0, y: 0, width: 100, height: 20)) 
    var number = 0 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     textField.backgroundColor = .white 
     textField.keyboardType = .numberPad 
     textField.delegate = self 
     view.addSubview(textField) 
    } 
} 

extension ViewController: UITextFieldDelegate { 
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     switch string { 
     case "0","1","2","3","4","5","6","7","8","9": 
      guard number < Int32.max/100 else { 
       return false 
      } 
      number *= 10 
      number += Int(string)! 
     case "": 
      number /= 10 
     default: 
      break 
     } 

     let formatter = NumberFormatter() 
     formatter.decimalSeparator = ":" 
     formatter.minimumIntegerDigits = 1 
     formatter.minimumFractionDigits = 2 
     textField.text = formatter.string(from: NSNumber(value: Double(number)/100.0)) 
     return false 
    } 
} 

let v = ViewController() 
PlaygroundPage.current.liveView = v.view 
+0

你可以使用Formatter的方法'string(for:Any)'而不是NumberFormatter方法'string來自:NSNumber)'並且傳遞任何數字類型,在你的情況下是'Double'。即:'formatter.string(for:Double(number)/ 100)' –

0
votes
answers
40 views
+10

如何防止tableview節頭在滾動時粘住?

2

我有許多部分的tableview。我正在使用一個實際的tableview單元格,我將其作爲自定義節標題使用。我遇到的問題是當我滾動部分標題「棒」到表的頂部,直到下一部分出現。如何防止tableview節頭在滾動時粘住?

我怎樣才能防止這種情況發生,實際上讓它像正常一樣向上滾動?

這裏是我的代碼

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    if section == 3 { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell") as! HeaderTableViewCell 
     return cell 
    } 
    return UIView() 
} 
+0

[UITableView的固定欄目標題]的可能的複製(https://stackoverflow.com/questions/17582818/uitableview-with-fixed-section-headers) – Larme

+0

這有點幫助,但是現在我不希望我的tableview被分組,因爲它使它看起來不同(有點像設置應用程序)。 – user7097242

沙发
0
0

一些可能的解決方案:

  1. 如果你有那麼只有一個部分泰伯維標題屬性設置爲你想要設置爲分節標題UIView的。
  2. 如果您有多個部分,請將每個部分的行數更改爲(該部分的行數+1),並將第0個索引處的行設爲標題。一些手工編碼將是必需的。
  3. 更改你的tableview分組,將需要重新設計UI,使設計看起來類似於普通的tableview單元格。
板凳
0
0

而不是UIHeaderViewCell,您應該使用UITableViewCell。將節標題高度設置爲0,併爲該節中的每個第零項顯示一個標題爲UITableViewCell的標題

地板
0
0

UITableViewStyle設置爲,標題將向上滾動單元格。 和

func tableView(_ tableView: UITableView, 
heightForFooterInSection section: Int) -> CGFloat 
{ 
    return 0.000001; 
}