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

0
votes
answers
41 views
+10

無法歸檔XCode中反應本地項目,帶豆莢的臨時配置

1
  • 反應母語:0.50.3
  • 的Xcode 9.1(9B55)

我有3個配置:無法歸檔XCode中反應本地項目,帶豆莢的臨時配置

  1. 默認
  2. 舞臺
  3. 生產

1和3產品>存檔工作正常。當我嘗試存檔Stage時,出現錯誤:

ld: library not found for -lPods-carrier_mobile_app 

在我的項目中添加Pod之後出現此錯誤。 Podfile看起來像

platform :ios, '8.0' 

target 'carrier_mobile_app' do 
    # Pods for carrier_mobile_app 
    pod 'RSKImageCropper' 
    pod 'QBImagePickerController' 
end 

我想我應該配置Pods for Stage配置正確。有任何想法嗎?

沙发
0
-1

參照此位置:https://medium.com/@guyeldar/setting-up-multiple-build-configurations-for-your-xcode-project-c237265e8324

理論上增加$(BUILD_DIR)/釋放$(EFFECTIVE_PLATFORM_NAME)到你的頭,你的目標框架,和庫搜索路徑會工作。然而,它只爲我工作了一次,然後我不小心改變了一些東西,從那以後它一直沒有工作。不過值得一試。

0
votes
answers
35 views
+10

目標C線程問題

4

下面的代碼:目標C線程問題

for(int i = 0; i < personListViewController.peopleCount; i++) { 
    [NSThread detachNewThreadSelector:@selector(getPerson:) toTarget:self withObject:i]; 
} 

getPerson看起來是這樣的:

- (void)getPerson:(int)whichPerson { } 

當我建立這個,我得到如下:警告:傳遞detachNewThreadSelector的」說法三: toTarget:withObject:'使指針從整數沒有鑄造

我想要做的就是通過一個int傳遞給getPerson通過detachNewThrea dSelector和我無法弄清楚如何讓它採取任何東西,但對象指針。我在這裏錯過了什麼?

沙发
0
12

您作爲-[NSThread detachNewThreadSelector:toTarget:withObject:]的第一個參數傳遞的選擇器必須採用類型爲id(指向對象實例的指針)的單個參數。雖然你可以玩遊戲(在大多數平臺上),但是指針的大小與int相同,並將您的值轉換爲id,然後返回int,但不應該依賴此行爲。相反,編寫一個包裝方法,該方法採用NSNumber參數並將int包裝在NSNumber中。該包裝方法的實現可能是:然後

- (void)getPersonWithNumber:(NSNumber*)number { 
    [self getPerson:[number integerValue]]; 
} 

你的循環將

for(NSInteger i = 0; i < personListViewController.peopleCount; i++) { 
     [NSThread detachNewThreadSelector:@selector(getPersonWithNumber:) toTarget:self withObject:[NSNumber numberWithInteger:i]; 
} 

請注意,我已經從int轉換爲NSInteger貫穿始終。除非您使用int的遺留代碼進行接口連接,否則您應該使用NSInteger,這是在新Cocoa代碼中每個平臺(32位或64位)上的適當大小整數的typedef。

+0

這樣做。謝謝你一百萬次。在objective-c中,我經常會遇到那些小事情。 – lewsid 2009-07-22 17:14:01

板凳
0
4

您需要將整數包裝在NSNumber類中,以使該數字成爲對象。

[NSThread detachNewThreadSelector:@selector(getPerson:) toTarget:self withObject:[NSNumber numberWithInteger:i]]; 

NSThread不採用原語(如int或char),所以你必須使用NSNumber!

希望有所幫助。

5
votes
answers
32 views
+10

Exported UTI for package/bundle

My Cocoa document-based app opens and writes custom packages/bundles.

Is this considered a proprietary format that needs to be exported via Exported UTIs (UTExportedTypeDeclarations)?

If so, what should be the values for:

  • Conforms To (UTTypeConformsTo)
  • Mime Types (public.mime-type)
  • Pboard Types (com.apple.nspboard-type)
  • OS Types (com.apple.ostype)

Finally, does the Exported UTI identifier (UTTypeIdentifier) need to be the same value than the Document Type identifier (LSItemContentTypes)?

沙发
+50
+50

Trial-and-error findings:

Is this considered a proprietary format that needs to be exported via Exported UTIs (UTExportedTypeDeclarations)?

Yes. While I couldn't find any explicit mention of this in the documentation, exporting the type was necessary for Finder to treat the directories as packages.

  • Conforms To (UTTypeConformsTo)

com.apple.package (source)

  • Mime Types (public.mime-type)

Empty. Directories don't have a Mime Type?

  • Pboard Types (com.apple.nspboard-type)

Empty. Pboard Types are deprecated?

  • OS Types (com.apple.ostype)

No clue.

Finally, does the Exported UTI identifier (UTTypeIdentifier) need to be the same value than the Document Type identifier (LSItemContentTypes)?

Yes, but I couldn't find any explicit mention of this in the documentation.

97
votes
answers
39 views
+10

Bundle ID Suffix? What is it?

I'm new to the iPhone submission process. Apple asks for the Bundle ID Suffix. What is this? Not sure what to put here and what the significance of it is.

沙发
+670

If you don't have a company, leave your name, it doesn't matter as long as both bundle id in info.plist file and the one you've submitted in iTunes Connect match.

In Bundle ID Suffix you should write full name of bundle ID.

Example:

Bundle ID suffix = thebestapp (NOT CORRECT!!!!)

Bundle ID suffix = com.awesomeapps.thebestapp (CORRECT!!)

The reason for this is explained in the Developer Portal:

The App ID string contains two parts separated by a period (.) — an App ID Prefix (your Team ID by default, e.g. ABCDE12345), and an App ID Suffix (a Bundle ID search string, e.g. com.mycompany.appname). [emphasis added]

So in this case the suffix is the full string com.awesomeapps.thebestapp.

板凳
+300

捆綁包標識符是您的應用程序的ID,系統將其用作域,可以存儲設置並唯一引用您的應用程序。

它以反向DNS表示法表示,建議您使用公司名稱和應用程序名稱來創建它。

名為Awesome Apps的公司名為The Best App的App的示例包ID如下所示:

com.awesomeapps.thebestapp

在這種情況下,後綴是thebestapp

謝謝!提交時,它會為我提供Bundle ID的下拉列表。在我的情況下,它說:nameofapp - *。如果我將bundle ID後綴設置為ABC,那麼我將在info.plist中將bundle id設置為什麼? - Ian McIntyre Silber 2010年8月10日1:09

應用程序ID與包ID完全分開。應用ID是應用商店中應用的ID,其中iOS使用捆綁ID來唯一標識您的應用。請閱讀我的答案。捆綁ID應遵循反向DNS格式:com.something.somethingelse - Jasarien 2011年5月20日8:17

需要明確的是,如果我的公司域名以.gov結尾,我的包ID應該是:gov.awesomeapps.thebestapp? - Vance Smith 2011年9月19日17:36

我可以使用四段嗎?例如com.awesomeapps.gamesdivision.thebestgame - Danyal Aytekin 2011年12月6日18:09

在理解原因方面,這裡的評論都沒有真正指出。請求是針對SUFFIX,而不是PREFIX。包名稱是thebestapp,因此後綴com.awesomeapps最終在前面。那不是後綴。由於Apple事先在其中一個輸入字段中請求應用程序名稱,因此形成了包INFIX。它的那部分是供應的。難怪OP很困惑。答案? - 只需放置任何內容,查看結果並在提交前進行編輯,只要確保你“告訴同樣的謊言”到處都是 - 16月16日凌晨4點16分

198
votes
answers
23 views
+10

AVAudioPlayer throws breakpoint in debug mode

Every time I load the app it stops as if I had set a breakpoint on this line:

self.audioPlayer = 
 [[[AVAudioPlayer alloc] initWithData:[dataPersister loadData:self.fileName] 
                                error:&outError] autorelease];

There's no breakpoint above or any place near this line. It only happens when I run the app in debug mode and nothing crashes after the breakpoint. The app works as nothing happened when I click "Continue program execution".

This is the loadData method, which is called with initWithData:

-(NSData*)loadData:(NSString*)fileName
{
    NSString *dataPath = [self.path stringByAppendingPathComponent:fileName];
    dataPath = [dataPath stringByStandardizingPath];
    NSData *data = [[[NSData alloc] initWithContentsOfFile:dataPath]autorelease ];
    return data;
}

The loadData function seems to be working fine. The requested mp3 file is loaded and played without any problems after the breakpoint.

Do you have any idea what I'm doing wrong?

EDIT: I ran a backtrace when it stops at the breakpoint. This was the output:

(lldb) bt
* thread #1: tid = 0x1c03, 0x30df1724 libc++abi.dylib`__cxa_throw, stop reason = breakpoint 1.2
    frame #0: 0x30df1724 libc++abi.dylib`__cxa_throw
    frame #1: 0x36403a24 AudioToolbox`ID3ParserHandle::ID3ParserHandle(void*, long (*)(void*, unsigned long, unsigned long, unsigned long, void**, unsigned long*)) + 452
    frame #2: 0x36403b0e AudioToolbox`ID3ParserOpen + 142
    frame #3: 0x3635bd16 AudioToolbox`MPEGAudioFile::ParseID3Tags() + 58
    frame #4: 0x3635b9aa AudioToolbox`MPEGAudioFile::ParseAudioFile() + 26
    frame #5: 0x3631723e AudioToolbox`AudioFileObject::DoOpenWithCallbacks(void*, long (*)(void*, long long, unsigned long, void*, unsigned long*), long (*)(void*, long long, unsigned long, void const*, unsigned long*), long long (*)(void*), long (*)(void*, long long)) + 166
    frame #6: 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612
    frame #7: 0x31f4c1ec AVFoundation`-[AVAudioPlayer initWithData:error:] + 120

"SOLUTION": It turns out, if I disable exception breakpoint for all exceptions and only use breakpoint for Objective-C exceptions the problem disappears. But it doesn't solve the problem that the allocation of AVAudioPlayer throws a C++ exception.

up vote 168 down vote accepted favorite
沙发
+1680
+50

添加異常斷點並將異常類型從“All”編輯為“Objective-C exceptions”

AudioToolbox中的某些類會拋出常規C ++異常。您可以通過這種方式過濾它們。

正如我在我的問題中寫過“解決方案”部分,我不認為這是一個解決方案。AVAudioPlayer不應拋出隨機異常。 - 托馬斯克萊門森12月22日在6:47

“AVAudioPlayer不應該拋出隨機異常” - 這不在我們手中。這就是框架的編寫方式,你必須忍受它。雖然,我同意這不是一個好主意 - Mugunth 2013年1月11日17:52

@Mugunth這是否意味著框架正在響應並糾正內部錯誤?你知道有關於它的任何其他文件嗎?我在網上找不到很多,這對我來說這可能是程序員的錯誤...... - 卸妝9月13日13時在9:35

+210

AVAudioPlayer和AVAudioRecorder都會拋出異常,其中有幾個。這些是由玩家在內部處理的,但如果你有一個“所有斷點”的斷點(即例外:全部,休息:投擲),你將捕獲這些例外。如果繼續執行這些應用程序,應用程序將繼續正常運行而不會崩潰。

到目前為止,我提出的唯一解決方案是單擊中斷點欄。斷點導航器,禁用此特定斷點,並在禁用它的情況下運行。

當/如果應用程序崩潰時拋出異常,我cmd-6,啟用該斷點,然後重新運行並執行無論我在墜毀時做了什麼。

編輯:設置為“Objective-C例外”顯然是如何做到的。

+60

這是一個截圖,顯示我是如何修復此錯誤的。我不確定這是否與上述答案相同,但我認為它類似。

  1. 轉到Xcode中的Breakpoint導航器。
  2. 按住Control鍵並單擊“所有異常”行。
  3. 選擇“編輯斷點...”選項。
  4. 更改 Exception 所有 Objective-C

+20

回溯幫助了很多,謝謝!我們最近開始遇到同樣的問題。事實證明,它投入的mp3文件沒有有效的ID3標籤並通過應用程序運行它們,例如 Tagr 將它們修好了!

在ID3標籤中設置缺少的字段後,應用程序不再停止AVAudioPlayer的初始化,但它仍然停止在播放指令... - ReinhardMänner2014年10月15日6:46

需要哪些字段?他們都是? - Reggian 2016年11月2日14:33

@Reggian我不記得了,就在很久以前。對於那個很抱歉!我不記得需要添加任何缺少的字段,如果我沒記錯的話,只需通過標籤清潔劑運行即可! - yo.ian.g 2016年11月4日18:25

+10

在Xcode 9.2中,您可以在看到特定異常後禁用它們。打開斷點菜單並單擊以禁用(淡化箭頭)

-40

嘗試將AVAudioPlayer設置為類變量!

在我的情況下,我已經將AVAudioPlayer設置為類變量,但它仍然不起作用。看起來你真的不知道解決方案 - Alex Cio 2015年3月31日14:31

14
votes
answers
41 views
+10

How to resize a tableHeaderView of a UITableView?

I'm having trouble resizing a tableHeaderView. It simple doesn't work.

1) Create a UITableView and UIView (100 x 320 px);

2) Set the UIView as tableHeaderView of the UITableView;

3) Build and Go. Everything is ok.

Now, I want to resizing the tableHeaderView, so I add this code in viewDidLoad:

self.tableView.autoresizesSubviews = YES;

self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;

The height of the tableHeaderView should appear with 200, but appears with 100.

If I write:

self.tableView.autoresizesSubviews = YES;


CGRect newFrame = myHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
myHeaderView.frame = newFrame;


self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

Then it starts with 200 of height, as I want. But I want to be able to modify it in runtime.

I've also tried this, without success:

self.tableView.autoresizesSubviews = YES;

self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;

[self.tableView.tableHeaderView setNeedsLayout];
[self.tableView.tableHeaderView setNeedsDisplay];
[self.tableView setNeedsLayout];
[self.tableView setNeedsDisplay];

The point here is: How do we resize a tableHeaderView in runtime ???

Have anyone able to do this?

Thanks

iMe

沙发
+80

我認為如果你只設置myHeaderView的高度就可以了:

  CGRect newFrame = myHeaderView.frame; newFrame.size.height = newFrame.size.height + 100; myHeaderView.frame = newFrame; self.tableView.tableHeaderView = myHeaderView;  
     
			
        
板凳
+30

在iOS 9及更低版本中, tableHeaderView 在調整大小後不會重新佈局。此問題已在iOS 10中得到解決。

要解決此問題,請使用以下代碼執行此操作:

  self.tableView.tableHeaderView = self.tableView.tableHeaderView;  
     
			
        

怎麼樣'sss'? - EmptyStack 2011年6月23日15:47

地板
+20

在iOS 9.x上,在 viewDidLoad 上執行此操作就可以了:

  var frame = headerView.frame frame.size.height = 11 //新增size headerView.frame = frame   

headerView 被聲明為 @IBOutlet var headerView:UIView!並連接在故事板上,在那裡它放在tableView的頂部,用作tableHeaderView。

4楼
+10

viewDidLoad 中的標題視圖屬性 tableView.tableHeaderView 設置高度似乎不起作用,標題視圖高度仍未按預期更改。

經過多次嘗試打擊這個問題。我發現,您可以通過在 - (void)didMoveToParentViewController:(UIViewController *)parent 方法中調用標題視圖創建邏輯來更改高度。

所以示例代碼會看起來像這樣:

   - (void)didMoveToParentViewController:(UIViewController *)parent {[super didMoveToParentViewController:parent]; if(_tableView.tableHeaderView == nil){UIView * header = [[[UINib nibWithNibName:@“你的標題視圖”包:nil] instantiateWithOwner:self options:nil] firstObject]; header.frame = CGRectMake(0,0,CGRectGetWidth([UIScreen mainScreen] .bounds),HeaderViewHeight); [_tableView setTableHeaderView:header]; }}  
     
			
        
5楼
0

我發現UIView的initWithFrame初始化程序沒有正確地遵循我傳入的矩形。因此,我做了以下完美的工作:

   - (id)initWithFrame:(CGRect) )aRect {CGRect frame = [[UIScreen mainScreen] applicationFrame]; if((self = [super initWithFrame:CGRectZero])){//醜陋的初始化行為 -  initWithFrame將無法正確地遵循我們傳遞的幀自身。幀= CGRectMake(0,0,frame.size.width,200); // ...}}   

這樣做的好處是可以更好地封裝到您的視圖代碼中。

6楼
0

我已經實現了表格標題的動畫高度更改,以便在點按時展開到整個屏幕。但是,代碼可以在其他情況下提供幫助:

  // Swift @IBAction func tapped(sender:UITapGestureRecognizer){self.tableView.beginUpdates()//需要更新單元格。//如果isHeaderExpandedToFullScreen將表標題折疊到原始高度{UIView.animateWithDuration(0.5,動畫:{() - &gt; Void in self.scrollView.frame.size.height = 110 //我的案例中的原始高度是110}}}} //將表格標題展開到整個屏幕,否則{let screenSize = self.view.frame //“screen”size UIView.animateWithDuration(0.5,動畫:{() - &gt; Void in self。scrollView.frame.size.height = screenSize.height})} self.tableView.endUpdates()//更新單元格所必需的。isHeaderExpandedToFullScreen =!isHeaderExpandedToFullScreen // Toggle}  
     
			
        
7楼
0

UITableView調整大小標題 - 帶範圍欄的UISearchBar

我想要一個帶有 UISearchBar UITableView 作為表的標題,所以我有一個層次結構看起來像這樣

  UITableView | |  - &GT; UIView | |  - &GT; UISearchBar | |  - &GT; UITableViewCells   

UISearchBarDelegate方法

正如其他地方所述,如果你在更改之後沒有setTableViewHeader,那麼什麼都不會發生。

   - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {searchBar.showsScopeBar = YES; [UIView animateWithDuration:0.2f動畫:^ {[searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:YES animated:YES]; 返回YES; }  - (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {searchBar.showsScopeBar = NO; [UIView animateWithDuration:0.f動畫:^ {[searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:NO animated:YES]; 返回YES; }   tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:YES animated:YES]; 返回YES; }  - (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {searchBar.showsScopeBar = NO; [UIView animateWithDuration:0.f動畫:^ {[searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:NO animated:YES]; 返回YES; }   tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:YES animated:YES]; 返回YES; }  - (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {searchBar.showsScopeBar = NO; [UIView animateWithDuration:0.f動畫:^ {[searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:NO animated:YES]; 返回YES; }   self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:YES animated:YES]; 返回YES; }  - (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {searchBar.showsScopeBar = NO; [UIView animateWithDuration:0.f動畫:^ {[searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:NO animated:YES]; 返回YES; }   self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:YES animated:YES]; 返回YES; }  - (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {searchBar.showsScopeBar = NO; [UIView animateWithDuration:0.f動畫:^ {[searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:NO animated:YES]; 返回YES; }   [searchBar setShowsCancelButton:YES animated:YES]; 返回YES; }  - (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {searchBar.showsScopeBar = NO; [UIView animateWithDuration:0.f動畫:^ {[searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:NO animated:YES]; 返回YES; }   [searchBar setShowsCancelButton:YES animated:YES]; 返回YES; }  - (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {searchBar.showsScopeBar = NO; [UIView animateWithDuration:0.f動畫:^ {[searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:NO animated:YES]; 返回YES; }   ^ {[searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:NO animated:YES]; 返回YES; }   ^ {[searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:NO animated:YES]; 返回YES; }  
     
			
        

8楼
0

如果使用autolayout設計自定義headerView,則需要在web-fetch或類似的懶惰任務之後更新headerView。然後在 iOS-Swift 中我做了這個並使用以下代碼更新了headerView:

  //重新加載你的單元格數據self.tableView.reloadData()dispatch_async( dispatch_get_main_queue(),{//這需要在主隊列上更新特定的tableview的headerview佈局,否則它將無法完美更新,因為reloaddata()被稱為self.tableView.beginUpdates()self.tableView.endUpdates()}  
     
			
        
9楼
0

顯然,到目前為止,Apple應該已經為tableHeaderView&amp;實現了UITableViewAutomaticDimension。tableFooterView ...

以下似乎對我使用佈局約束:

  CGSize s = [self systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; CGRect f = [自我框架]; f.size = s; [self setFrame:f];  
     
			
        
10楼
0

如果你的tableHeaderView是一個內容可調的webView,你可以嘗試:

  [self.webView.scrollView addObserver:self forKeyPath:@“contentSize”options:NSKeyValueObservingOptionNew context:nil];  - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)對象更改:(NSDictionary&lt; NSKeyValueChangeKey,id&gt; *)更改上下文:(void *)context {self.webView.height = self.webView.scrollView.contentSize 。高度; self.tableView.tableHeaderView = self.webView; }   

我在iOS9和iOS11上測試過,運行良好。

11楼
0

這僅適用於使用自動佈局並將 translatesAutoresizingMaskIntoConstraints = false 設置為自定義標題視圖時。

最佳和最簡單的方法是覆蓋 intrinsicContentSize 內部 UITableView 使用 intrinsicContentSize 來決定其頁眉/頁腳大小。在自定義視圖中覆蓋 intrinsicContentSize 後,您需要做的事情如下所示

  1. 配置自定義頁眉/頁腳視圖的佈局(子視圖)
  2. 調用 invalidateIntrinsicContentSize()
  3. 調用 tableView.setNeedsLayout() tableView.layoutIfNeeded()

    然後 UITableView 的頁眉/頁腳將根據需要更新。無需將視圖設置為nil或重置。

    UITableView.tableHeaderView .tableFooterView 真有意思的是 UIStackView < / code>無法管理其 arrangeSubviews 如果要將 UIStackView 用作tableHeaderView或tableFooterView,則必須將stackView嵌入 UIView 並覆蓋 UIView intrinsicContentSize

    UITableView.tableHeaderView .tableFooterView 真有意思的是 UIStackView 無法管理其<代碼> arrangedSubviews 如果要將 UIStackView 用作tableHeaderView或tableFooterView,則必須將stackView嵌入 UIView 並覆蓋 UIView intrinsicContentSize

    UITableView.tableHeaderView .tableFooterView 真有意思的是 UIStackView 無法管理其<代碼> arrangedSubviews 如果要將 UIStackView 用作tableHeaderView或tableFooterView,則必須將stackView嵌入 UIView 並覆蓋 UIView intrinsicContentSize

12楼
-30

更改高度後,您是否嘗試過 [self.tableView reloadData]

0
votes
answers
32 views
+10

在macOS中接收承諾的電子郵件10.12+

1

之前,我使用以下方法來發現從Mail.app中刪除的電子郵件(/ - 線程)的電子郵件元數據&。在macOS中接收承諾的電子郵件10.12+

 if let filenames = draggingInfo.namesOfPromisedFilesDropped(atDestination: URL(fileURLWithPath: destinationDir!)) { 
      /// TODO: in future implementation Mail might return multiple filenames here. 
      ///   So we will keep this structure to iterate the filenames 
      //var aPaths: [String] = [] 
      //for _ in filenames { 
       if let aPath = pb.string(forType: "com.apple.pasteboard.promised-file-url") { 
        return aPath 
       } 
      //} 
      //return aPaths 
     } 

janky的種類,但它的工作,因爲"com.apple.pasteboard.promised-file-url"在這些情況下,只能提供。

自10.12然而,API似乎已經改變,並期待在WWDC2016 talk看來,蘋果希望我們現在使用NSFilePromiseReceiver。 我嘗試了幾種方法,但我無法獲得承諾的文件URL彈出。

設置:

class DropzoneView: NSView { 

var supportedDragTypes = [ 

    kUTTypeURL as String, // For any URL'able types 
    "public.url-name", // E-mail title 
    "public.utf8-plain-text", // Plaintext item/E-mail thread title/calendar event date placeholder 
    "com.apple.pasteboard.promised-file-content-type", // Calendar event/Web URL/E-mail thread type detection 
    "com.apple.mail.PasteboardTypeMessageTransfer", // E-mail thread detection 
    "NSPromiseContentsPboardType", // E-mail thread meta-data 
    "com.apple.pasteboard.promised-file-url", // E-mail thread meta-data 
    "com.apple.NSFilePromiseItemMetaData" // E-mail thread meta-data 
] 

override func viewDidMoveToSuperview() { 
    var dragTypes = self.supportedDragTypes.map { (type) -> NSPasteboard.PasteboardType in 
     return NSPasteboard.PasteboardType(type) 
    } // Experiment: 
    dragTypes.append(NSPasteboard.PasteboardType.fileContentsType(forPathExtension: "eml")) 
    dragTypes.append(NSPasteboard.PasteboardType.fileContentsType(forPathExtension: "emlx")) 

    self.registerForDraggedTypes(dragTypes) 
} 

} 

處理:

extension DropzoneView { 

override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation { 
    return .copy 
} 

override func draggingUpdated(_ sender: NSDraggingInfo) -> NSDragOperation { 
    return .copy 
} 

override func performDragOperation(_ sender: NSDraggingInfo) -> Bool { 

    let pasteboard: NSPasteboard = sender.draggingPasteboard() 
      guard let filePromises = pasteboard.readObjects(forClasses: [NSFilePromiseReceiver.self], options: nil) as? [NSFilePromiseReceiver] else { 
     return false 
    } 

    var files = [Any]() 
    var errors = [Error]() 

    let filePromiseGroup = DispatchGroup() 
    let operationQueue = OperationQueue() 
    let newTempDirectoryURL = URL(fileURLWithPath: (NSTemporaryDirectory() + (UUID().uuidString) + "/"), isDirectory: true) 
    do { 
     try FileManager.default.createDirectory(at: newTempDirectoryURL, withIntermediateDirectories: true, attributes: nil) 
    } 
    catch { 
     return false 
    } 

    // Async attempt, either times out after a minute or so (Error Domain=NSURLErrorDomain Code=-1001 "(null)") or gives 'operation cancelled' error 
    filePromises.forEach({ filePromiseReceiver in 
     filePromiseGroup.enter() 
     filePromiseReceiver.receivePromisedFiles(atDestination: newTempDirectoryURL, 
               options: [:], 
               operationQueue: operationQueue, 
               reader: { (url, error) in 
                Swift.print(url) 
                if let error = error { 
                 errors.append(error) 
                } 
                else if url.isFileURL { 
                 files.append(url) 
                } 
                else { 
                 Swift.print("No loadable URLs found") 
                } 

                filePromiseGroup.leave() 
     }) 
    }) 

    filePromiseGroup.notify(queue: DispatchQueue.main, 
          execute: { 
           // All done, check your files and errors array 
           Swift.print("URLs: (files)") 
           Swift.print("errors: (errors)") 
    }) 

    Swift.print("URLs: (files)") 

    return true 
} 

其它嘗試:

// returns nothing 
    if let filenames = pasteboard.propertyList(forType: NSPasteboard.PasteboardType(rawValue: "com.apple.pasteboard.promised-file-url")) as? NSArray { 
     Swift.print(filenames) 
    } 

    // doesn't result in usable URLs either 
    if let urls = pasteboard.readObjects(forClasses: [NSPasteboardItem.self /*NSURL.self, ???*/], options: [:]) as? [... 

任何指針將不勝感激。

+0

您是否設法取得進展? – iphaaw

沙发
0
1

我設法讓文件「彈出」,但我無法得到他們的細節。它會立即傳輸,然後在返回錯誤消息之前掛起60秒。

也許這是一個線索,但checkExtension方法永遠不會返回,除非註釋掉並設置爲true。

希望這有助於踢罐頭在路上了一下:

class DropView: NSView 
{ 
    var filePath: String? 

    required init?(coder: NSCoder) { 
     super.init(coder: coder) 

     self.wantsLayer = true 
     self.layer?.backgroundColor = NSColor.red.cgColor 

     registerForDraggedTypes([NSPasteboard.PasteboardType 
      .fileNameType(forPathExtension: ".eml"), NSPasteboard.PasteboardType.filePromise]) 
    } 

    override func draw(_ dirtyRect: NSRect) { 
     super.draw(dirtyRect) 
     // Drawing code here. 
    } 

    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation { 
     if checkExtension(sender) == true 
     { 
      self.layer?.backgroundColor = NSColor.blue.cgColor 
      return .copy 
     } 
     else 
     { 
      return NSDragOperation() 
     } 
    } 

    fileprivate func checkExtension(_ drag: NSDraggingInfo) -> Bool 
    { 
     return true 
//  guard let board = drag.draggingPasteboard().propertyList(forType: NSPasteboard.PasteboardType(rawValue: "com.apple.mail.PasteboardTypeMessageTransfer")) as? NSArray, 
//   let path = board[0] as? String 
//   else 
//   { 
//    return false 
//   } 
// 
//  let suffix = URL(fileURLWithPath: path).pathExtension 
//  for ext in self.expectedExt 
//  { 
//   if ext.lowercased() == suffix 
//   { 
//    return true 
//   } 
//  } 
//  return false 
    } 

    override func draggingExited(_ sender: NSDraggingInfo?) 
    { 
     self.layer?.backgroundColor = NSColor.gray.cgColor 
    } 

    override func draggingEnded(_ sender: NSDraggingInfo) 
    { 
     self.layer?.backgroundColor = NSColor.gray.cgColor 
    } 

    override func performDragOperation(_ sender: NSDraggingInfo) -> Bool 
    { 

     let pasteboard: NSPasteboard = sender.draggingPasteboard() 

     guard let filePromises = pasteboard.readObjects(forClasses: [NSFilePromiseReceiver.self], options: nil) as? [NSFilePromiseReceiver] else { 
      return false 
     } 

     print ("Files dropped") 
     var files = [URL]() 

     let filePromiseGroup = DispatchGroup() 
     let operationQueue = OperationQueue() 
     let destURL = URL(fileURLWithPath: "/Users/andrew/Temporary", isDirectory: true) 
     print ("Destination URL: (destURL)") 

     filePromises.forEach ({ filePromiseReceiver in 
      print (filePromiseReceiver) 
      filePromiseGroup.enter() 

      filePromiseReceiver.receivePromisedFiles(atDestination: destURL, 
                options: [:], 
                operationQueue: operationQueue, 
                reader: 
                { (url, error) in 
                 print ("Received URL: (url)") 
                 if let error = error 
                 { 
                  print ("Error: (error)") 
                 } 
                 else 
                 { 
                  files.append(url) 
                 } 
                 print (filePromiseReceiver.fileNames, filePromiseReceiver.fileTypes) 

                 filePromiseGroup.leave() 
                }) 
     }) 

     filePromiseGroup.notify(queue: DispatchQueue.main, 
           execute: 
           { 
            print ("Files: (files)") 
            print ("Done") 
           }) 
     return true 
    } 

} 

的這個輸出是有點不可思議。 url變量一直重複我通過的目錄名稱,例如:

Files dropped 
Destination URL: file:///Users/andrew/Temporary/ 
<NSFilePromiseReceiver: 0x6000000a1aa0> 

** one minute gap ** 

Received URL: file:///Users/andrew/Temporary/Temporary/ 
Error: Error Domain=NSURLErrorDomain Code=-1001 "(null)" 
["Temporary"] ["com.apple.mail.email"] 
Files: [] 
Done 
+0

謝謝@iphaaw,情節變厚了!實際上,我向蘋果提交了一份支持請求,並且收到了一條消息,說他們「知道這個問題,但目前沒有解決方法或解決方法或指示何時將解決問題」......我從應用程序中撤回了我的應用程序存儲並轉移到非osx項目。 –

0
votes
answers
38 views
+10

檢查,看看NSDate是6個月前

2

我已經從我的服務器返回一個NSDate值,我需要知道這個NSDate是多久以前。我需要寫一個條件來查看日期是否超過6個月(在Swift中,但我可以轉換Objective-C)。檢查,看看NSDate是6個月前

這裏是NSDate的返回,印在控制檯時:

(2015-09-07 01:22:01 +0000) 

如何檢查,如果超過這個時間超過6個月以上?

的邏輯是這樣的:

//dateValue is the NSDate returned 
var dateValue = log.createdAt 
    if (dateValue > 6 months){ 
    } 
    else{ 
    } 
+0

檢查這些鏈接,http://stackoverflow.com/questions/26198526/nsdate-comparison-using-swift和http://stackoverflow.com/questions/ 1889164/get-nsdate-today-yesterday-this-week-last-week-this-month-last-month-var – UlyssesR

+0

[兩個NSDates之間的月和天數](http://stackoverflow.com/q/11654741 ) –

沙发
0
-3
if date.earlierDate(NSDate(timeInterval: -60*60*24*30*6, sinceDate: NSDate())) == date { 
     // 6 months passed since date 

    } 
+0

好的,你想減少這個答案的重點還是解釋爲什麼它不夠好? – Etgar

+2

不是每個月都有30天,夠好嗎? :) – Breek

+1

我沒有投票給你,但這不是一個好的解決方案。日數從蛾到月不等。正如我的答案中所建議的,使用'NSCalendar'方法來比較日期更好。 –

板凳
0
4

看看在NSCalendar類,具體方法如components:fromDate:toDate:options:

如果這兩個日期在6個月和一天之間是不同的,那是> 6個月嗎? 6個月和1秒怎麼樣?或者,如果兩個日期相差至少7個月,您是否只考慮兩個日期的差異大於6個月?

您需要根據您的確切結果對解決方案進行不同的編碼。

地板
0
0

斯威夫特3:

if (nextStepDate.earlierDate(Date(timeInterval: -60*60*24*30*6, since: Date())) == date) { 
    //do something           
} 
0
votes
answers
40 views
+10

努力蒙上了NSSsearchfiled在迅速的Xcode

-5

我試圖調用一個函數多數民衆贊成在另一個類努力蒙上了NSSsearchfiled在迅速的Xcode

但它告訴我,我在想念一個參數

這個代碼是關於我的Class1

@IBAction func nssearchfiled(_ sender: Any) { 

    class2().functionforsearchfield() 
} 

其說 缺少的參數#1的參數呼叫

更新:

繼承人在我的班級數的代碼2

import Cocoa 

class class2{ 



func functionforsearchfield() { 

    print("works") 

} 
+2

你可以顯示functionforsearchfield的代碼(或者至少是聲明)嗎?也不清楚,是class2 - 一個變量,或者你在調用該函數之前實例化class2? – Jeepston

+3

您需要發佈您的class2代碼,但是您寫的代碼幾乎肯定是錯的:您正在創建一個實例,然後在其上運行一個方法,而沒有任何類型的返回值,然後讓實例立即死亡。這並沒有通過良好的編碼習慣的氣味測試。你想做什麼? –

+0

我更新了我的帖子並添加了我的class2代碼 –

沙发
0
-1

好吧我想出如何,繼承人如何我做到了

class1的

@IBAction func nssearchfiled(_ sender: Any) { 
    class2().functionforsearchfield((nssearchfiled)!) 
} 

類class2

類EnterPressedInRoomBarxxx {

func functionforsearchfield(_ nsearchfildpassed: NSSearchField) { 
    let newdata = nsearchfildpassed as NSSearchField 
} 

} 
+2

在你的問題中,你會看到'func functionforsearchfield()',我們發現它顯然需要*無參數*。這就是爲什麼錯誤信息不匹配,您的問題無法解答。然後在你的回答中告訴我們,解決方案是在調用它時添加一個參數,而且這個參數本身就是另一種方法。這是無稽之談,因爲它回答了與問題中不同的代碼。 100%無用。 – Moritz

+0

lol moritz ahahahah –

+0

moritz我問的是真的很容易理解 –

499
votes
answers
50 views
+10

How do I enter RGB values into Interface Builder?

How can I enter RGB or Hex color values for backgrounds in Interface Builder? I can select predefined colors but I would like to manually enter in RGB values. Where can I do this?

up vote 459 down vote accepted favorite
沙发
+4590
+50

點擊顏色滑塊圖標,然後從下拉列表中選擇“RGB滑塊”。

您還可以使用放大鏡作為顏色選擇器從屏幕上的任何位置拾取精確的顏色; 另外,請參閱@ ken在下面的優秀評論,闡明色彩空間如何與放大鏡一起使用。

+360

雖然Tyler的回答回答了這個問題,但是你可能會遇到使用選擇器的問題,因為它使用了顯示器的顏色空間(由Ken澄清)。

如果你想匹配Photoshop和Xcode之間的RGB值完全(沒有顏色空間之間的轉換)然後您需要將圖像保存為通用RGB並使用通用RGB顏色空間輸入任何滴管值。

  • 當您選擇“保存為Web”時&amp; Devices“來自Photoshop,取消選中”轉換為sRGB“框。

+20

聽起來您對Mac OS X彩色面板不熟悉。單擊顏色面板窗口頂部的選項卡以選擇其他選取器。拾取器也是插件,因此可以添加用於顏色選擇的新UI。例如,請參閱開發人員顏色選擇器

+20

我知道這是一個老問題,但今天我需要找到同樣問題的答案,這讓我走上正軌。panic.com的顏色選擇器確實正確安裝,但顏色選擇器下拉菜單中的十六進制選項始終將其設置為RGB。所以沒有好處。相反,我發現了這個:

http://wafflesoftware.net/hexpicker/

顯示十六進制值,它在Xcode 5.0.1和Mavericks上完全有效。

0

檢查上面的快照,然後轉到顏色托盤,選擇第二個按鈕(RGB滑塊(矩形圖像) - 放置在托盤頂部的圓圈旁邊)。您可以輸入RGB值。