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: 21

658
votes
answers
40 views
+10

Converting Storyboard from iPhone to iPad

I have an iPhone application which has a storyboard. Now I want to provide an iPad application too. So I asked me whether there is a function which helps me convert my iPhone storyboard to an iPad storyboard.

To be specific:

Is there a similar function or is there only the manual way ?

up vote 535 down vote accepted favorite
沙发
+5350
+50

I found out a kind of solution:

  1. Duplicate your iPhone-Storyboard and rename it MainStoryboard_iPad.storyboard

  2. Close Xcode and then open this file any text editor.

  3. Search for targetRuntime="iOS.CocoaTouch"and change it to targetRuntime="iOS.CocoaTouch.iPad"

  4. Change the code in the MainStoryboard_iPad.storyboard from:

    <simulatedScreenMetrics key="destination" type="retina4"/> to

    <simulatedScreenMetrics key="destination"/>

  5. Now save everything and reopen Xcode. The iPad-Storyboard has the same contents as the iPhone-file but everyting could be disarranged.

This saved me hours - hopefully this will help you

+1如果可以的話,我會從你自己的名聲中給你+100。精彩的建議!我唯一不能做的就是用Dashcode打開故事板,所以我使用TextWrangler(但我認為任何文本編輯器都可以)。謝謝! - Piotr Justyna 1月3日在17:19

好的建議,謝謝。當你在它的時候,你可能也想把所有的寬度=“320”改為寬度=“768”,高度=“480”到高度=“1024”等......直接從這裡開始。因為它比在IB中逐個元素地做它簡單得多。 - Ben G 12年6月6日22:39

不要在xCode中使用Dashcode,也不要使用textWrangler:右鍵單擊故事板 - >“打開為” - >“源代碼”完成後,做同樣的事情,除了使用“Interface Builder - IOS StoryBoard” - hokkuk 3月14日'12在16:23

@PiotrJustyna你可以做到這一點。按下問題下的賞金,選擇所需金額並獎勵現有答案... - Filip Radelic 12年8月28日在1:10

獲取iPad格式還會更改MainStoryboard_iPad.storyboard中的代碼: 至 - Marcus Schwab於12年6月6日6:32

+610

If you had created a universal project, by default empty iPad storyboard would have been created, you just have to select iPhone storyboard select all (Command+A), copy (Command+C) and paste it on iPad storyboard. Make sure to move the entry point from the empty storyboard to newly copied storyboard before compiling.

簡單,它100%工作。做到了 謝了哥們! - Pantelis Proios 2013年7月7日18:11

最佳答案,簡單的解決方案,並允許您隨後輕鬆修改界面,不像最佳答案。:) - Matt Reid 2013年7月13日20:49

同意。這在廣告中用於iOS 7.0的Xcode 5.02 - Alex Zavatone 2014年2月3日17:52

佈局怎麼樣? - dreamBegin 2016年6月9日9:58

+100

That didn't quite work for me. I did something a little bit different.

  1. Create a new story board file for the iPad version
  2. Open both the new file and the file i want to copy in textwrangler (text editor)
  3. Copied the xml text from old file to the new file between these xml tags
  4. First Tag <scenes> <!--Contents View Controller-->
  5. Paste Here
  6. End Tags </class> </classes>

That worked for me. I got a new layoutout with all my outlets connected, which alone saved me a few hours.

+1其他人不適合我,這使一切都按預期工作 - Shereef Marzouk 2013年1月14日在11:01

您可以在Xcode中執行此操作。恰好/右鍵單擊.storyboard文件,然後單擊打開方式>源代碼以查看原始XML。 - Matt Kantor 2013年6月25日21:26

+80

From reading many threads on stackoverflow i discovered the solution is-

1.Duplicate your iPhone-Storyboard and rename it MainStoryboard_iPad.storyboard

2.right click on the storyboard -> “open as” -> “Source Code”.

3.Search for targetRuntime="iOS.CocoaTouch"and change it to targetRuntime="iOS.CocoaTouch.iPad"

5.Search for <simulatedScreenMetrics key="destination" type="retina4"/> and change it to to <simulatedScreenMetrics key="destination"/>

4.Now save everything and right click on MainStoryboard_iPad.storyboard “open as” ->"IOS StoryBoard" 5. you may also have to change your constraints. Thats all you have done.

+80
1. Create New Storyboard file with MainStoryboard_iPad.storyboard
2. Copy All the views from MainStoryboard and paste to MainStoryboard_iPad.storyboard
+60

1 - Create your "MainStoryboard_iPad.storyboard";

2 - Right-click on you "MainStoryboard_iPhone.storyboard" and "Open as -> Source Code". Copy everything;

3- Right-click on you "MainStoryboard_iPad.storyboard" and "Open as -> Source Code". Paste everything. Now Search and change:

  • targetRuntime="iOS.CocoaTouch" to targetRuntime="iOS.CocoaTouch.iPad"
  • type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" to type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.iPad.XIB"

4 - Save. Now reopen but using the interface builder. You will only have to re-arrange.

This method can be used for .xib files too

這是最好的方法。因為所有視圖和組件都將調整為ipad格式。 - Ben於2013年12月8日11:15

在最新版本的ios7中無需更改type =“com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB”。 - super9 2014年3月10日3:23

+50

This is going the other way, but I was able to do a select all & copy in my iPad storyboard (~35 scenes) and paste it into my iPhone storyboard. The scene sizes were automatically adjusted. I only saw two problems, I had to replace UISplitViewController (since it's only iPad), and the default background became transparent instead of gray (still working on fixing that properly, without manually setting the background for everything).

EDIT: It seems the default background for UITableView in the Attributes inspector is rather strange. I had to manually set the background to "Group Table View Background Color" for grouped table views, and "White Color" for non-grouped table views. It then was displayed as "Default" (I assume since it then matched a hardcoded value). -- Actually, even easier, changing from "Grouped" to "Static" and back seems to reset the default color.

+40

Here's something that saved me hours and might help those of you with Python skills.

I've been building an app for the last two months, focused on just iPad iterating the UX with the team.

Today focused on building out iPhone version, followed the steps above (thanks!) but I didn't want to then have to resize all the ui elements from iPad dimensions in the visual storyboard editor.

So I wrote this little python jig script to scan through the storyboard file for x, y, width, height and scale everything down by by ratio 320./768. Allowed me then to just focus on fine adjustments.

  1. Copy your iPad storyboard into a new file. (e.g. iPhoneStoryboard.storyboard)

  2. Run the script below with the copied storyboard filename as the first parameter.

  3. Will generate output file with suffix _adjusted.storyboard (e.g. iPhoneStoryboard.storyboard_adjusted.storyboard)

Hope it helps...

import re
import sys
import math

afile = sys.argv[1]

scale = 320./768.

number_pattern = '[-0-9]+(.[0-9]+)?'
#width_pattern = 'width="[-0-9]+( ?px)?"'
width_pattern = 'width="[-0-9]+(.[0-9]+)?( ?px)?"'
height_pattern = 'height="[-0-9]+(.[0-9]+)?( ?px)?"'
x_pattern = 'x="[-0-9]+(.[0-9]+)?( ?px)?"'
y_pattern = 'y="[-0-9]+(.[0-9]+)?( ?px)?"'


def replacescaledvalue(scale,pattern,sometext,replacefmt) :
    ip = re.search(pattern, sometext, re.IGNORECASE)
    if(ip) :
        np = re.search(number_pattern,ip.group(0))
        if(np) :
            val = float(np.group(0))
            val = int(math.floor(val*scale))
            sval = replacefmt+str(val)+'"'#+'px"'
            newtext = re.sub(pattern,sval,sometext)
            return newtext
    else :
        return sometext

fin = open(afile)
fout = open(afile+"_adjusted.storyboard", "wt")
for line in fin:
    newline = line
    newline = replacescaledvalue(scale,width_pattern,newline,'width="')
    newline = replacescaledvalue(scale,height_pattern,newline, 'height="')
    newline = replacescaledvalue(scale,x_pattern,newline, 'x="')
    newline = replacescaledvalue(scale,y_pattern,newline, 'y="')
#   print newline
    fout.write( newline )

fin.close()
fout.close()

嗨Chrish,我是phython的新手。所以我無法理解將iphone故事板改為iPad的代碼。所以,請你幫我解決這個問題。我的ipad故事板正在轉換成iphone故事板而沒有任何問題。但我需要將我的iphone故事板轉換為iPad。因此,在上面的腳本中需要更改需要的地方,或者您可以共享將iphone轉換為ipad的腳本。提前致謝。 - Shubham 2014年11月14日11:35

@Chris Robertson Chris,如果我想使用這個腳本進行iPhone到iPad的轉換,我會改變'scale = 320./768'。'scale = 768./320。'? - 查爾斯羅伯遜於2016年10月26日16:43

+30

Go to your Target Summary and change devices to universal, then go down and set the ipad version to any storyboard you like including a copied and renamed one if you like.

+30

Just as a quick gotcha note to those who may have had my issue with this:

My issue:

The storyboard content copied over nicely to a new board file I added. However, it would not put changes over to my provisioned iPad. Noticing that I had to switch over the designated storyboard for the build target (see image) let the changes show.

I'd post an image if I had the points, but the setting is located in:

Project navigator on the left side source menu, root target of project (center pane) general tab, (second subhead) deployment info, with the iPad button tab selected.

From there, choose your storyboard under "main interface."

Thanks for the post, I hope this mention helps a snag somewhere.

+30

Just for fun, on XCode 5.1 and iOS 7.1 I also needed to change the values of "toolVersion" and "systemVersion" to this:

toolsVersion="5023" systemVersion="13A603"

Without this, the new storyboard file wouldn't compile

+30

Using the XCode6 Size Classes you no longer need to convert the storyboard to iPad. The same Storyboard can be used for both the iPhone and the iPad, saving you from keeping two files up to date.

The resulting storyboard is compatible with iOS7+.

Read more about this here: https://developer.apple.com/library/ios/recipes/xcode_help-IB_adaptive_sizes/chapters/AboutAdaptiveSizeDesign.html#//apple_ref/doc/uid/TP40014436-CH6-SW1

Use size classes to enable a storyboard or xib file to work with all available screen sizes. This enables the user interface of your app to work on any iOS device.

+20

This functionality is now built-in. For example, if one changes the project settings in Deployment Info -> Devices from iPhone to Universal, the following dialog will show up:

enter image description here

它可能是Xcode中的一個錯誤,但我從未有過這方面的工作。由此產生的iPad故事板不會添加到項目中,並且它似乎不會被創建。 - s73v3r 2014年4月1日18:08

+20

I followed this thread when I was hit with the same issue yesterday. The steps I followed

  1. For Xcode 5.1, I had to do some cleanup of iPhone storyboard like missing reuseIdentifiers of Table cells, provide story board id for every controller, remove unused scenes.
  2. Copy MainStoryboard_iPhone.storyboard to MainStoryboard_iPad.storyboard.
  3. Using vi editor - changed targetRuntime="iOS.CocoaTouch" to targetRuntime="iOS.CocoaTouch.iPad"
  4. Change the code in the MainStoryboard_iPad.storyboard from: <simulatedScreenMetrics key="destination" type="retina4"/> to <simulatedScreenMetrics key="destination"/>
  5. Open the project in Xcode.
  6. Changed the Deployment devices to Universal - Chose the option of NOT copying the iPhone Storyboard.
  7. Xcode will default the Deployment Target to 7.1, took care of the deprecated functions.
  8. To fix the misplaced view error in iPad Storyboard - Changed the Frame Layout for Controllers giving errors.

That was it.. Thanks all for your help..

+20

For Xcode10

  1. Just duplicate Main.storyboard

  2. Then re-name files to Main_iPad.storyboard and Main_iPone.storyboard

  3. Set appropriate names in .plist

enter image description here

4.Just select the proper .storyboard to configure enter image description here

+10

The easiest and most reliable way to do this is to copy paste from your iPad storyboard.

  1. Create a new storyboard and name it something like MainStoryboard_ipad.
  2. Make your app a Universal app by setting the Devices property to Universal on the Summary page of the Target properties for your project. enter image description here
  3. Open your iPhone storyboard and select all and copy
  4. Open your iPad storyboard and paste.

You'll have to go about resizing, but it can be faster than recreating the whole storyboard.

+10

There is a really simple solution for Xcode versions that support size classes (Tested in Xcode 7 which is the current version at the time of writing). Check the "use size classes" checkbox on a storyboard file (File Inspector), confirm that dialog that appears. Then uncheck that same checkbox - Xcode will ask you if you want to use this storyboard with an iPhone or iPad, and convert the screens in it appropriately. No need to directly edit the storyboard file. For both iPad and iPhone, just copy the same storyboard and configure one for iPad and one for iPhone using the described method.

And Before someone suggest to use size classes - while great, they are less convenient for heavily customized UI, such as games etc

+10

A Different Approach

  1. Add an empty-View-Controller with Navigation-Controller in the iPad-Storyboard

  2. Change the Class to the Class of your first ViewController used for iPhone, "fooViewController"

  3. Add the Storyboard-Identifier in the iPhone-Storyboard "fooViewController_storyboard_identifier" for the first ViewController

  4. Go to "fooViewController.m"

  5. Add bool Variable bool nibWasLoadForIpad=false

  6. Go to viewDidLoad-Method

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && !nibWasLoadForIpad)
{
    nibWasLoadForIpad=true;
    UIStoryboard* Storyboard_iphone=[UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil];
    fooViewController *controller = [Storyboard_iphone instantiateViewControllerWithIdentifier:@"fooViewController_storyboard_identifier"];
    [self.navigationController pushViewController:controller animated:YES];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
}

(ps. Know problem is that the view-backgrounds will be set to white)

0

You should create a bug report with Apple. You can say it's a duplicate of mine (10167030) which has been open since September 2011. The frustrating thing from my point of view is that the feature existed in Xcode 3...

0

Thanks for the answers everybody.

I followed the above steps but when I ran the app under the simulator or my iPad it kept on just using the iPhone storyboard.

For some reason, when I changed the target device to be Universal instead of iPhone, Xcode (v5.0) didn't update the app-Info.plist file to include the iPad storyboard, so I had to manually add the following entry (using the plist editor in Xcode):

Main storyboard file base name (iPad) ==> MainStoryboard_iPad

0

I just change (additionally to the answer from @tharkay):

 <device id="ipad9_7" orientation="landscape">

and works great !

I use this in XCode 8.3.3

0
votes
answers
45 views
+10

iPhone X不尊重設置標籤欄隱藏動畫

0

我有一個視圖控制器被推到一個導航控制器是在標籤欄控制器內。視圖控制器隱藏底部按鈕,當按下按鈕時,會出現它顯示的工具欄。無論我嘗試什麼,當視圖控制器被按下或彈出時,它都不會停止向上/向下滑動工具欄的動畫。這似乎只是iPhone X上的一個問題。有誰知道如何解決它?iPhone X不尊重設置標籤欄隱藏動畫

+0

同樣的問題: https://stackoverflow.com/questions/46232929/why-page-push-animation-tabbar-moving-up-in-the -iPhone-X – Alexander

沙发
0
0

這個答案https://stackoverflow.com/a/47225653/1211917幫助我:

class SafeAreaFixTabBar: UITabBar { 

    var oldSafeAreaInsets = UIEdgeInsets.zero 

    @available(iOS 11.0, *) 
    override func safeAreaInsetsDidChange() { 
     super.safeAreaInsetsDidChange() 

     if oldSafeAreaInsets != safeAreaInsets { 
      oldSafeAreaInsets = safeAreaInsets 

      invalidateIntrinsicContentSize() 
      superview?.setNeedsLayout() 
      superview?.layoutSubviews() 
     } 
    } 

    override func sizeThatFits(_ size: CGSize) -> CGSize { 
     var size = super.sizeThatFits(size) 
     if #available(iOS 11.0, *) { 
      let bottomInset = safeAreaInsets.bottom 
      if bottomInset > 0 && size.height < 50 && (size.height + bottomInset < 90) { 
       size.height += bottomInset 
      } 
     } 
     return size 
    } 

    override var frame: CGRect { 
     get { 
      return super.frame 
     } 
     set { 
      var tmp = newValue 
      if let superview = superview, tmp.maxY != 
       superview.frame.height { 
       tmp.origin.y = superview.frame.height - tmp.height 
      } 

      super.frame = tmp 
     } 
    } 
} 
26
votes
answers
27 views
+10

Codesign error: Certificate identity appearing twice

CodeSign error: Certificate identity 'iPhone Developer: XXXX (12345678)' appears more than once in the keychain. The codesign tool requires there only be one.

So I go to my keychain and delete it. But I get this error every time I restart Xcode 4 and some app is adding the expired old certificate back into keychain. Any ideas why and which app?

+90
<p>我花了相當多的時間來解決同樣的問題。在嘗試修復它之後,我終於意識到這是Xcode中的一個錯誤。這篇文章給了我解決它的線索:<a href="http://tapadoo.com/2012/certificates-magically-re-appearing-in-your-keychain-try-this/" rel="noreferrer">證書神奇地重新出現在您的鑰匙串中</a> </ p> <p>在我的情況下,匹配的私鑰位於系統鑰匙串中,並且只有我的名字(很難說它是用於配置)。我必須:</ p> <ul> <li>將關聯的私鑰移動到'login'keychain </ li> <li>重新啟動Xcode並註意到私鑰現在顯示為關聯(確認它的用途是什麼) )</ li> <li>刪除證書和私鑰</ li> < li>重新啟動Xcode和poof!它停止添加我的舊證書</ li> </ ul> <p>一個有趣的觀察是,當您刪除證書時,它不會刪除關聯的私鑰。在視覺上,它顯示了證書下面的私鑰。不要被愚弄。</ p> <p>祝你好運!</ p>

刪除私鑰直接為我工作。 - ohmi 2012年9月18日19:36

刪除私鑰也為我工作 - 最新xcode十月2012更新山獅 - ina 10月9日'12在19:16

板凳
+40
+50

好的,找到另一個“相關”問題的答案。 Xcode過期證書問題 Xcode 4的已知問題 http://openradar.appspot.com/9173280

我遇到了同樣的問題。但是我沒有在這里或其他主題中看到答案。你有沒有設法解決它? - 懸崖1月9日在9:41

+40

如果您是iOS開發人員和企業iOS開發人員計劃的成員,並且您為兩個應用程序輸入了相同的公司名稱,那麼最終將獲得兩個具有相同名稱的有效分發證書。

我相信這個問題可以解決這種情況:開發人員和企業分佈之間的CodeSign衝突

+30

我對xcode45-DP1也有同樣的問題。這適用於我:

  1. 從鑰匙串中刪除與您的帳戶相關的所有證書。退出鑰匙串

  2. 從xcode中刪除與您的帳戶相關的所有配置文件:organizer:device:Library:provisioning profiles。退出xcode

  3. 撤銷您的證書並重新生成並將其下載到您的構建計算機

  4. ,然後再下載配置文件,點擊下載按鈕旁邊的編輯以確保您的名字已被選中。

  5. 然後下載配置文件

  6. 雙擊證書將其安裝到鑰匙串上 <

對我不起作用:( - Sunkas 2012年8月20日9:34

+30

答案是這裡

使用管理器中的舊證書刪除所有舊的配置文件,然後退出XCode,從Keychain中刪除舊證書並重新啟動XCode。

看起來像xcode將在引用配置文件中引用時保留證書

+10

我遇到了將殭屍證書重新填充到我的鑰匙串並且證書身份出現兩次的問題。簡單地刪除重複的證書不起作用。

在Xcode中,當我在目標中查看我的代碼簽名時,我記得我在“Ad Hoc”構建中有一個與“Release”構建不同的分發配置文件。

當我生成新證書時,我只下載了Ad Hoc版本的新配置文件,而不是Release版本。

Xcode掛在這兩個配置文件的證書上,因此Xcode導致重複的證書...因為我忘了正確更新我的配置文件。

確保更新所有您的配置文件到新證書,

+10

我遇到了這個問題並閱讀了有關它的每一條信息,最後我自己找到了解決方案。人們沒有提到的是 BEFORE 清理Xcode組織者中的證書, BEFORE 清理鑰匙串中過期的密鑰,您需要確保沒有任何過期配置門戶中的證書。如果您使用舊的開發人員證書的舊應用程序甚至會有一個過期的證書,Xcode會在第一次構建時將其拉入其管理器,然後從那裡轉到您的鑰匙串並導致重複。

+10

在我的情況下,“緩存”Xcode看起來是一個附加的iOS設備。要確定這是否適合您:

  1. 斷開所有iOS設備的連接
  2. 從Keychain Access中刪除違規證書和私鑰
  3. 重新啟動Xcode < / li>
  4. 檢查鑰匙串訪問:在我的情況下,此時未重新創建副本
  5. 重新連接iOS設備
  6. 重新啟動Xcode
  7. 檢查Keychain Access:在我的情況下,此時重複被重新創建

    如果這是您的根本原因,您可以通過確保在啟動Xcode之前斷開iOS設備來解決問題。 / p>

@samvermette唯一的區別是你從應用商店獲得SKPaymentTransactionStateRestored,而不是SKPaymentTransactionStatePurchased。由於您沒有在這裡使用真錢,無論出於何種目的,SKPaymentTransactionStateRestored在測試過程中100%相當於SKPaymentTransactionStatePurchased。將您的應用狀態重置為“未購買”取決於您(只需刪除相關的鑰匙串條目或用於緩存“用戶購買X”的任何內容) - bobobobo 2013年11月21日3:16

0
<p> <a href="https://stackoverflow.com/a/6163599/285694">簡單地刪除冗餘證書</a>對我不起作用。似乎每次調用xcodebuild時,它都會從某個緩存中的“重新創建”鑰匙串中的證書......與<a href =“https://stackoverflow.com/a/11023941/285694”相同的問題> avi </a>我為它創建了一個hack / fix,試圖找到文件被緩存的位置並清除它,但沒有運氣。最後,對我有用的東西(有點黑客,但是嘿,你還能做什麼),是找出證書編號是什麼,並在調用xcodebuild後不久手動將其從鑰匙串中刪除。首先,轉到你的/ usr / bin /目錄(或者你的xcodebuild文件的任何目錄,試試<code> xcodebuild </ code> 並運行以下命令:</ p> <pre> <code> sudo mv xcodebuild xcodebuild_actual </ code> </ pre> <p>然後使用您喜歡的編輯器(不要忘記sudo)創建一個文件以下代碼:</ p> <pre> <code> xcodebuild_actual $ *&amp; echo“xcodebuild啟動,等待擦除證書,10秒”睡眠2回顯“擦除證書......”sudo security -v delete-certificate -t?? -Z 407629F811D52C0BB7AD31BBB18DCB496354B05E </ code> </ pre> <p>注意:你' ll必須修改你的sudoers文件才能有權運行這個特定的命令,而無需輸入密碼。</ p> <p>將上面-Z後的十六進制標識替換為有問題的殭屍證書的十六進制標識。最後,確保xcodebuild文件是可執行的:< / p> <pre> <code> sudo chmod 755 xcodebuild </ code> </ pre> <p>您現在可以打開您的鑰匙串並運行構建命令,並觀察有問題的殭屍證書是如何復活的,然後立即被槍斃在它成為代碼簽名的問題之前。希望Apple能為此提出一個真正的解決方案。</ p>

是的,製作產品的新副本,並在代碼中更改產品名稱(可能是#defined)似乎是實際測試的最簡單的解決方案。 - JulianSymes 2014年11月13日11:07

0
<p>在我的情況下刪除證書不起作用。XCode 4似乎緩存或恢復它們。最終對我有用的訣竅是讓keychain和xcode運行。然後在鑰匙串中將我的2個證書(dev + dist)從“登錄”拖到“系統”。然後復製品神奇地重新出現,我能夠刪除它們,然後我將證書拖回'登錄'</ p>
0

非常簡單,將正確的證書導出到您的桌面。刪除鑰匙串中的證書。嘗試使用錯誤消息構建源代碼(沒有證書..)然後再次導入證書。=&GT; 成功了!

無法讓這個工作。我收到了構建錯誤。我將zip中的所有文件複製到我的項目中,並將#import 替換為#define ILSimReplaceRealStoreKit 1 #import“ILSimStoreKit.h” - Jay Q. 2012年1月21日6:00 )

您只需要以ILSimSK開頭的文件。其他的東西是演示應用程序。也許您應該發布一個問題,其中包含您遇到的確切錯誤。“我遇到了構建錯誤”並沒有多說。 - Emile Cormier 12年1月21日在7:53

0

我剛剛刪除了鑰匙串中的一個私鑰,用於我不再需要的證書。

即使證書重新出現,但私鑰不會重新出現。現在檢查有效證書,只顯示一個證書,其他私鑰被刪除的證書不再顯示在有效證書下。

我認為這是解決此問題的最簡單方法。

0

我曾經處理過同樣的問題。我已經通過從xcode中的Organizer選項卡中刪除未使用的配置文件來解決它。實際上,Keychain將從此配置文件獲取該證書,該配置文件是過期證書或通過吊銷證書構建。

因此,您只需從“管理器”選項卡中刪除此配置文件。管理器位於xcode的右上方按鈕打開它,而不是在管理器中刪除您不使用的配置文件。

這是截圖,

並且不要忘記從鑰匙串中刪除額外的證書,但在那之後那些證書不會再出現。

0
votes
answers
30 views
+10

Dismissing a Presented View Controller

I have a theoretic question. Now ?'m reading Apple's ViewController guide.

They wrote:

When it comes time to dismiss a presented view controller, the preferred approach is to let the presenting view controller dismiss it. In other words, whenever possible, the same view controller that presented the view controller should also take responsibility for dismissing it. Although there are several techniques for notifying the presenting view controller that its presented view controller should be dismissed, the preferred technique is delegation.

But I can't explain, why I have to create a protocol in presented VC and add delegate varible, create delegate method in presenting VC for dismissing presented VC, instead of a simple call in presented view controller method

[self dismissViewControllerAnimated:NO completion:nil]?

Why is the first choice better? Why does Apple recommend it?

沙发
0

這是很多胡扯。如果需要代表團是好的,但是如果它使代碼更複雜 - 而且確實如此 - 則需要有理由。

我確信Apple有其原因。但更簡潔,更簡潔的是,只要讓所呈現的VC做出解僱,除非有其它原因,否則今天沒有人提出我能看到的。

協議在需要時非常出色,但面向對象的設計絕不是讓模塊彼此之間不必要地進行通信。

Tom Love(Objective C的共同開發人員)曾評論說,Objective C是“優雅”,“小”,“清晰”和“定義明確”(與C ++比較)。他很容易說。

板凳
0

Swift

 讓rootViewController:UIViewController =(UIApplication.shared.keyWindow?.rootViewController)!if(rootViewController.presentedViewController!= nil){rootViewController.dismiss(animated:true,completion:{// completion block。})}  
     
			
        
地板
0

您可以關閉超級視圖窗口

self.view.superview?.window?.close()

125
votes
answers
39 views
+10

Do NSUserDefaults persist through an Update to an app in the Appstore?

Is this the case? Do NSUserDefaults get reset when you submit an update to an app on the App Store, or are they reset?

My app is crashing when updated but not crashing when downloaded fully - so I'm trying to determine what could possibly be different in the updated session to the freshly downloaded session.

Cheers, Nick.

up vote 111 down vote accepted favorite
沙发
+1110
+50

除非用戶刪除應用,否則通常不會重置它們。對於基本數據,NSUserDefaults是保存數據的最佳方式,如首選項,日期,字符串等。如果您希望保存圖像和文件,文件系統是更好的選擇。

對不起 - 我忘了謝謝你的快速回答! - 如果任何人都可以找到任何形式的Apple文檔的鏈接,這將是非常好的....在NSUserDefaults的文檔中它沒有說明這一點,所以我認為我(錯誤地)假設默認值被擦除。對於Apple來說,這似乎是最安全的方式來更新應用程序! - 尼克卡特賴特09年10月28日17:33

這可能是最安全的方式,但如果用戶必須在應用程序更新時重新設置所有首選項,那麼對用戶來說會非常煩人。我通常每天有三到四個應用更新; 我相信其他iPhone用戶還有更多。擦除每次更新的首選項基本上會使我的iPhone無法使用。 - 克里斯托弗約翰遜09年10月29日1:51

文檔文件夾中的數據可以像NSUserDefaults一樣容易消失。然而,它們都是罕見的場合,並且與正常升級過程完全無關 - coneybeare 09年10月29日2:09

謝謝克里斯托弗 - 是的,我同意。我的問題是我使用NSUserDefaults來存儲程序化事件,並且在安裝應用程序時依賴它們被重置。我在iPhone設備(和蘋果測試)上的所有測試都將該應用程序作為新安裝進行了測試。沒有任何文檔或方式來測試更新我無法重複我們所有客戶現在遇到的更新崩潰。總結一下 - 可能是一個艱難的教訓! - 尼克卡特賴特09年10月29日10:27

+70

我相信答案是肯定的,它會堅持下去。這也完全記錄在Apple iPhone OS編程指南的應用程序目錄章節中。

+40
  1. 直接回答發布的問題:是。
  2. 您的問題:您的應用因邏輯問題而崩潰。假設您將對象存儲在默認值中,並且應用程序會在啟動時(或其他位置)檢查它的值。在您更新時,您可以更改其檢查或使用的方式,例如,您期望值,但對象為零,反之亦然。這可能會導致SIGABRT或EXC_BAD_ACCESS。
+20

如果你有CoreData模型並且你在模型中更改了某些內容並進行了更新,而沒有管理遷移,這可能是你的應用程序在更新時崩潰的原因......

我希望它可能是一個案例:)不是NSUserdefault - JulianKról14年4月7日在12:25

+10

我有類似的經歷。我們的應用程序在Settings.Bundle / Root.Plist中存儲版本號。這將通過iPhone設置應用程序顯示。我們發現在安裝時,版本號從應用程序包中加載 - 因此版本號是正確的。但是在更新時,版本號不會更改。這給人的印像是用戶正在運行以前版本的應用。我們沒有與版本號相關聯的任何邏輯,它只是用於顯示(在診斷故障時可以由聯絡中心工作人員使用)。

我們的經驗是當用戶沒有清除NSUserDefaults時更新我們的應用程序,但“設置”屏幕也不會更新。

0
votes
answers
29 views
+10

iPhone - 同時啓動兩個進程

0

我必須同時啓動多個進程 - AVAudioPlayer的播放,定時器和文件寫入操作。iPhone - 同時啓動兩個進程

如果我只是在一個方法中寫入它們,它們會一個接一個地執行,所有操作的開始都會有一點滯後。

任何想法?感謝任何幫助。

謝謝。

沙发
0
2

你爲什麼不使用線程?

您可以通過使用容易做到這一點:

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg 

或使用NSOperationNSOperationQueue

查看this question瞭解更多詳情。

注:

  • 如果你,如果你想在另一個線程,你還需要另一個runloop使用計時器使用任何自動釋放類
  • 你需要在你的線程自動釋放池。
  • 小心線程安全。例如,我不知道AVAudioPlayer是否可以在與主線程不同的線程上使用。
  • 我不認爲你可以從的NSOperation
+2

如果你只做了一次,performSelectorInBackground是最簡單的代碼。但是,如果你做了很多,它不是最佳的。我會建議NSOperation路線。 – 2009-11-18 12:54:09

+0

非常感謝你們。 – lostInTransit 2009-11-18 14:11:43

板凳
0
1

添加太多的併發內安排的NSTimer可以在這裏是錯誤的做法。您可能想調查設置定時器並在主線程上播放音頻文件,同時在後臺線程上執行阻止文件寫入調用。這裏的重要概念是避免阻塞主線程中的調用,特別是在處理文件或網絡I/O時。

由於iPhone是單CPU設備,因此您會希望避免創建太多的額外線程,並且多個線程會導致更多的資源消耗。

0
votes
answers
44 views
+10

iPhone應用程序啓動

2

如何讓我的iPhone應用程序每次在同一個地方啓動,即我的「主屏幕」?我不希望用戶回到他們上次玩的時候 - 在遊戲過程中 - 但這就是發生了什麼。 在此先感謝您的任何提示!iPhone應用程序啓動

沙发
0
6

您需要將您的info.plist文件中的UIApplicationExitsOnSuspend密鑰設置爲YES。然後,應用程序將在主頁按鈕被按下時退出,並在重新打開時重新啓動。

+0

嘿謝謝! - 但我甚至沒有在我的info.plist中看到這個成員 - 它是僅限於iPhone4的字段嗎? – 2011-04-06 11:51:04

+0

它只在iPhone 4上執行任何操作,但您可以安全地將其添加到早期操作系統的info.plist文件中;它將在3.x和2.x上被忽略。 – peterjb 2011-04-06 12:50:52

+0

只需在plist中創建一個新條目,將鍵粘貼到鍵列中,鍵入BOOL類型,然後選中該框 - 它將起作用。它不一定會在Xcode中得到簡單的英文翻譯。 – peterjb 2011-04-06 12:57:34

板凳
0
2
- (void)applicationWillResignActive:(UIApplication *)application { 

[self.navigationController popToRootViewControllerAnimated:YES]; 

} 

/* 當應用程序要由活性移動到不活動狀態時發送。對於某些類型的臨時中斷(例如來電或SMS消息)或用戶退出應用程序並開始轉換到後臺狀態時,可能會發生這種情況。 使用此方法可暫停正在進行的任務,禁用定時器並降低OpenGL ES幀速率。遊戲應該使用這種方法來暫停遊戲。 */

+0

rootviewcontroller是主屏幕.... – 2011-04-06 11:45:06

+0

你怎麼知道他是否使用UINavigationController? – 2011-04-06 11:47:47

+0

/* 當應用程序即將從活動狀態轉移到非活動狀態時發送。對於某些類型的臨時中斷(例如來電或SMS消息)或用戶退出應用程序並開始轉換到後臺狀態時,可能會發生這種情況。 使用此方法可暫停正在進行的任務,禁用定時器並降低OpenGL ES幀速率。遊戲應該使用這種方法來暫停遊戲。 */ – 2011-04-06 11:47:48

地板
0
3

這大概只發生,因爲你的應用程序並沒有真正停止 - 它只是簡單地背後。 (如果您在查看跳板時雙擊主頁按鈕,它是否顯示在底部?如果是,它仍然在運行。)

您可以禁用此行爲(因此您的應用在用戶點擊主頁按鈕時退出)在您的info.plist文件中設置UIApplicationExitsOnSuspend鍵(在Xcode中稱爲「應用程序不在後臺運行」)。有關更多信息,請參閱Apple的Information Property List Key Reference文檔。

或者,您可以簡單地在應用程序的添加委託中捕獲applicationDidEnterBackground:UIApplicationDelegate方法,並以編程方式處理該情況。 (即:做任何你需要做的事來將你的應用程序重置回「家」屏幕等)

+0

aha是的,它在後臺 - 但我沒有在我的info.plist文件中顯示的UIApplicationExitsOnSuspend字段 - 就好像它認爲它是一個3.2文件? – 2011-04-06 11:59:01

4楼
0
1

設置UIApplicationExitsOnSuspendYES int Info.plist

+0

感謝所有這些迴應! - 好吧,我現在看到它是一個iPhone4領域;但我不想瞄準3.2,所以它在舊手機上運行? – 2011-04-06 11:54:30

0
votes
answers
38 views
+10

如何用Objective C殺死一個線程?

2

我有一個第三方C++庫,我已經把它放入它自己的線程(目前使用NSThread)調用。我想給用戶停止執行該線程的能力。 (我很清楚這可能導致的所有問題,但我仍然希望這樣做。)如何用Objective C殺死一個線程?

根據Apple's Thread Programming Guide,Cocoa有可能這樣做。這也適用於iPhone嗎?還是我必須依靠Posix線程來完成我的目標?

乾杯

MrMage

+4

如果你認爲你想停止一個線程直接和外部沒有某種同步原語來停止它在一個已知點然後,不,你不明白它可能造成的問題。其中一個問題很可能是崩潰或損壞的內存。不可避免的如此。 – bbum 2009-08-29 18:35:46

+0

即使當我想殺死的線程(工作線程)不使用任何主線程的對象,反之亦然? 圖書館的開發者告訴我,他很高興地使用這種線程取消來阻止他的工作線程,並且他沒有遇到這樣的主要問題。 – MrMage 2009-08-29 21:46:37

+0

如果他的庫以任何方式使用任何系統庫調用,則強制殺死線程將導致未定義的行爲。這包括malloc(),甚至。即使它現在看起來有效,它是否繼續在軟件更新和體系結構更改上工作也是一個完全不同的問題。 – bbum 2009-08-30 06:35:16

沙发
0
10

正確的方式來阻止你的線程執行是要求它很好地停止執行。然後,在你的線索中,你會聽取這樣的要求,並在適當的時候服從他們。

由於很頁面鏈接到您說:

雖然可可,POSIX,和多服務提供程序直接殺線程,使用這種程序的強烈反對。殺死一個線程可以防止線程自行清理。由該線程分配的內存可能會泄漏,並且線程當前正在使用的任何其他資源可能無法正確清理,從而在稍後創建潛在問題。

如果您預計需要在操作過程中終止線程,則應該從一開始就設計線程以響應取消或退出消息。對於長時間運行的操作,這可能意味着要定期停止工作並檢查是否收到了這樣的消息。如果消息確實要求線程退出,線程將有機會執行任何需要的清理並正常退出;否則,它可能會重新開始工作並處理下一塊數據。

0
votes
answers
52 views
+10

推送通知 - 後臺進程 - iPhone

1

我剛纔聽到 - 「推送通知」有可能在iPhone推送通知 - 後臺進程 - iPhone

我需要以下詳細信息。

  • 什麼是推送通知?
  • 它是如何工作的?
  • 它需要什麼?
  • 任何示例代碼鏈接都可用?
  • 任何文檔鏈接(如果有)?
  • 「StackOverFlow Masters」關於開發上述要求的一些指導/提示。

預先感謝與家人#1我&分享你的知識。

+0

兩部分教程完成推送通知的指南。 http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12 http://www.raywenderlich.com/3525/apple-push-notification-services -Tutorial-part-2 – 2012-10-05 06:24:50

沙发
0
5

您正在尋找的背景處理類型不適用於推送通知。

推送通知允許您通知用戶某事。一個例子是一個Twitter客戶端,當用戶在Twitter上收到一條直接消息時發送通知。

當應用程序未運行時,推送通知無法對iPhone上發生的事情做出反應。取而代之,它取決於你有一個服務器,它決定何時發送通知,然後發送一個通知。

我在您的應用程序中看不到任何背景處理需求。如果您存儲了用戶的初始位置,則在下次應用加載時,您可以獲取其位置並計算兩者之間的距離。如果您正在尋找旅行的路線,那麼除非您有make a deal with AT&T like Loopt just did,否則您運氣不佳。

+0

你告訴 - 「一個例子是一個Twitter客戶端,當用戶在Twitter上收到一條直接消息時發送通知。」我們怎麼能這樣做? – 2009-09-04 21:14:10

+1

你需要一個服務器來檢查Twitter的直接消息。當它檢測到一個新的,它需要排隊推送通知給該用戶的手機。 – ceejayoz 2009-09-05 00:50:51

板凳
0
1

推送通知不是真的爲此目的,你應該閱讀推送通知在這裏的蘋果網站http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction/Introduction.html,它更像是當你的用戶爲我的消息時,你可以讓用戶得到它,而不必讓他們打開應用程序。現在爲了您的目的,爲什麼不能在關閉應用程序時存儲位置,一旦重新打開應用程序,您可以重新獲取位置,使用以前的位置和新的位置來計算行駛的公里數?

地板
0
1

雖然只與本討論相關,但我認爲你可能會對Loopt與AT & T至track user's iPhones(按月收費)的協議感興趣。

4楼
0
0

Apple Push Notification服務(簡稱APN)是推送通知功能的核心。這是一項強大且高效的服務,可將信息傳播至iPhone,iPad和iPod touch設備等設備。每個設備都與該服務建立一個經過認證和加密的IP連接,並通過此持久連接接收通知。如果應用程序的通知在應用程序未運行時到達,則設備會通知用戶應用程序有數據正在等待它。

軟件開發者(「提供者」)在其服務器軟件中發起通知。提供商通過一個持久安全的通道與APN連接,同時監控針對其客戶端應用程序的傳入數據。當應用程序的新數據到達時,提供程序通過該通道準備併發送通知給APN,這會將通知推送到目標設備。

檢查此鏈接解釋清楚蘋果推送通知服務

http://mobiforge.com/developing/story/programming-apple-push-notification-services

0
votes
answers
62 views
+10

的UIButton,同時也是UITextField不作爲的UIViewController

0
的一部分

我是新來迅速做出反應,我有這樣的代碼,它是UIViewControllerUITextFieldUIButton的UIButton,同時也是UITextField不作爲的UIViewController

import Foundation 
import UIKit 

class ManualTagController: UIViewController, UIGestureRecognizerDelegate, UITextFieldDelegate { 
    let addTagButton = UIButton() 
    let tagTextfield = UITextField() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.backgroundColor = UIColor.white 
     self.view.layer.cornerRadius = self.view.frame.width/80 

     self.addTagButton.setTitle("TAG", for: .normal) 
     self.addTagButton.backgroundColor = UIColor(red: 200.0/255, green: 17.0/255, blue: 57.0/255, alpha: 0.75) 
     self.addTagButton.addTarget(self, action: #selector(addTag), for: .touchUpInside) 
     self.addTagButton.layer.masksToBounds = true 
     self.addTagButton.clipsToBounds = true 
     view.addSubview(addTagButton) 

     self.tagTextfield.placeholder = "# or 'hey siri'" 
     self.tagTextfield.alpha = 1 
     self.tagTextfield.font = UIFont.systemFont(ofSize: 52) 
     self.tagTextfield.borderStyle = UITextBorderStyle.roundedRect 
     self.tagTextfield.autocorrectionType = UITextAutocorrectionType.no 
     self.tagTextfield.keyboardType = UIKeyboardType.default 
     self.tagTextfield.returnKeyType = UIReturnKeyType.done 
     self.tagTextfield.clearButtonMode = UITextFieldViewMode.whileEditing; 
     self.tagTextfield.contentVerticalAlignment = UIControlContentVerticalAlignment.center 
     self.tagTextfield.delegate = self 
     view.addSubview(tagTextfield) 
    } 

    override func viewDidLayoutSubviews() { 
     self.addTagButton.frame = CGRect(x: 10.0, y: self.view.frame.height - 77.0, width: self.view.frame.width - 20.0, height:72.0) 
     self.addTagButton.layer.cornerRadius = self.addTagButton.frame.width/80 
     self.tagTextfield.frame = CGRect(x: 10.0, y: 5.0, width: self.view.frame.width - 20.0, height:72.0) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @objc private func addTag() { 
     //Database service code here... 
     print("in addTag .........") 
     //This will go where service is done and it is successful 
    } 

    internal func textFieldDidBeginEditing(_ textField: UITextField) { //delegate method 
     // 
    } 

    internal func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { //delegate method 
     return false 
    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { //delegate method 
     textField.resignFirstResponder() 

     return true 
    } 
} 

在我的主要UIViewController - 它被加載像這樣,點擊按鈕。它被裝精 - 我只是展示瞭如何我在這裏做layer,以及它是如何初始化:

@objc private func openManualTag() { 
     let frameHeightAdjusted = self.view.frame.height - 5/8 * self.view.frame.height 
     let manualTag = ManualTagController() 
     manualTag.view.layer.shadowColor = UIColor.black.cgColor 
     manualTag.view.layer.shadowOpacity = 0.3 
     manualTag.view.layer.shadowOffset = CGSize.zero 
     manualTag.view.layer.shadowRadius = 5 
     manualTag.view.layer.masksToBounds = true 
     manualTag.view.clipsToBounds = false 
     manualTag.view.layer.shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 159)).cgPath 
     manualTag.view.tag = 1 
     manualTag.view.frame = CGRect(x: 0, y: frameHeightAdjusted, width: self.view.frame.width, height: 159.0) 
     manualTag.view.transform = CGAffineTransform(translationX: 0, y: -frameHeightAdjusted - 159) 

     DispatchQueue.main.async { 
      self.view.addSubview(manualTag.view) 
      UIView.animate(withDuration: 0.5, animations: { 
       manualTag.view.transform = .identity 
      }) 
     } 
    } 

的問題既不是UIButton也不UITextField將工作......既不是竊聽他們作出迴應無論如何。我究竟做錯了什麼?

UPDATE

發佈所有的ViewController,我的主視圖控制器,只是櫃面:

import UIKit 
import GoogleMaps 


class ViewController: UIViewController, CLLocationManagerDelegate { 
    let locationManager = CLLocationManager() 
    var center = CLLocationCoordinate2D() 
    let tagButton = TagButton() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tagButton.addTarget(self, action: #selector(openManualTag), for: .touchUpInside) 
     self.tagButton.backgroundColor = UIColor(red: 200.0/255, green: 17.0/255, blue: 57.0/255, alpha: 0.5) 
     self.tagButton.layer.shadowColor = UIColor.black.cgColor 
     self.tagButton.layer.shadowPath = UIBezierPath(roundedRect: self.tagButton.bounds, cornerRadius: self.tagButton.frame.width/2).cgPath 
     self.tagButton.layer.shadowOffset = CGSize.zero 
     self.tagButton.layer.shadowOpacity = 0.3 
     self.tagButton.layer.shadowRadius = 5 
     self.tagButton.layer.masksToBounds = true 
     self.tagButton.clipsToBounds = false 
     self.tagButton.layer.borderWidth = 5 
     self.tagButton.layer.borderColor = UIColor.white.cgColor 
     view.addSubview(self.tagButton); 
    } 

    override func viewDidLayoutSubviews() { 
     //let tagButton = view.viewWithTag(0) 
     self.tagButton.frame = CGRect(x: self.view.frame.width/2 - 36, y: self.view.frame.height - 0.2 * self.view.frame.height, width: 72.0, height: 72.0) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func loadView() { 
     let camera = GMSCameraPosition.camera(withLatitude: -33.86, longitude: 151.20, zoom: 6.0) 
     let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera) 
     view = mapView 
    } 

    func addMarker(tag: String) { 
     self.locationManager.startUpdatingLocation(); 
     let marker = GMSMarker() 
     marker.position = CLLocationCoordinate2D(latitude: self.center.latitude, longitude: self.center.longitude) 
     marker.title = tag 
     //marker.snippet = //USERNAME 
     DispatchQueue.main.async { 
      marker.map = self.view as? GMSMapView 
     } 
    } 

    @objc private func openManualTag() { 
     let frameHeightAdjusted = self.view.frame.height - 5/8 * self.view.frame.height 
     let manualTag = ManualTagController() 
     manualTag.view.layer.shadowColor = UIColor.black.cgColor 
     manualTag.view.layer.shadowOpacity = 0.3 
     manualTag.view.layer.shadowOffset = CGSize.zero 
     manualTag.view.layer.shadowRadius = 5 
     manualTag.view.layer.masksToBounds = true 
     manualTag.view.clipsToBounds = false 
     manualTag.view.layer.shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 159)).cgPath 
     manualTag.view.tag = 1 
     manualTag.view.frame = CGRect(x: 0, y: frameHeightAdjusted, width: self.view.frame.width, height: 159.0) 
     manualTag.view.transform = CGAffineTransform(translationX: 0, y: -frameHeightAdjusted - 159) 

     let transparencyButton = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)) 
     transparencyButton.backgroundColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha:0.4); 
     transparencyButton.addTarget(self, action: #selector(dismissHelper(sender:)), for: .touchUpInside) 

     DispatchQueue.main.async { 
      self.addChildViewController(manualTag) 
      self.view.addSubview(manualTag.view) 
      manualTag.didMove(toParentViewController: self) 

      UIView.animate(withDuration: 0.5, animations: { 
       manualTag.view.transform = .identity 
      }) 

      self.view.insertSubview(transparencyButton, belowSubview: manualTag.view) 
     } 
    } 

    @objc func dismissHelper(sender: UIButton) 
    { 
     self.view.viewWithTag(1)?.removeFromSuperview() 
     sender.isHidden = true; 
    } 

    override func viewDidAppear(_ animated: Bool) { 
     self.locationManager.delegate = self 
     self.locationManager.requestWhenInUseAuthorization() 
     self.locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     self.locationManager.startUpdatingLocation() 
    } 

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { 
     print("Error" + error.localizedDescription) 
    } 

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     let userLocation = locations.last 
     self.center = CLLocationCoordinate2D(latitude: userLocation!.coordinate.latitude, longitude: userLocation!.coordinate.longitude) 

     let mapView = view as! GMSMapView 
     DispatchQueue.main.async { 
      mapView.camera = GMSCameraPosition.camera(withLatitude: self.center.latitude, longitude: self.center.longitude, zoom: 14.0) 
     } 

     print("Latitude :- (userLocation!.coordinate.latitude)") 
     print("Longitude :-(userLocation!.coordinate.longitude)") 

     self.locationManager.stopUpdatingLocation() 
    } 
} 
+0

是否將'isUserInteractionEnabled'屬性設置爲true? – Xcoder

+0

謝謝,但它並沒有幫助 – ewizard

+0

當它打開時,屏幕響應我手動標記視圖外的水龍頭 – ewizard

沙发
0
1

當你添加一些其他的視圖控制器的視圖到當前的VC,你必須首先添加將控制器視爲您當前的控制器。這樣的UIKit將提供全觸控以及其他VC相關事件正確子視圖控制器:

DispatchQueue.main.async { 
    self.addChildViewController(manualTag) 
    self.view.addSubview(manualTag.view) 
    manualTag.didMove(toParentViewController: self) 

    UIView.animate(withDuration: 0.5, animations: { 
     manualTag.view.transform = .identity 
    }) 
} 

此外,我不建議你修改一個UIViewController的「視圖」屬性。這可能會導致不同的問題,例如不響應您的UITextField或Autolayout崩潰。只需添加您的地圖爲全屏幕子視圖中viewDidLoad方法:

super.viewDidLoad() 

let camera = GMSCameraPosition.camera(withLatitude: -33.86, longitude: 151.20, zoom: 6.0) 
let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera) 
mapView.frame = view.bounds 
view.addSubview(mapView) 

而且不要忘記刪除你的loadView硬道理()方法!

+0

謝謝!解決了manualTag ....上的按鈕,但UITextField仍然沒有響應 – ewizard

+0

,因此UITextField委託方法沒有被調用,對吧? –

+0

鍵盤永不出現...生病記錄方法 – ewizard